终于看到很感兴趣的算法题,呵呵,动手试试~
public bool NextStep(int x,int y )
{
if (x < 0 || x >=Width)
return false;
if(y<0||y>=Height)
return false;
//走过的点数比步数大1
if(CurRoad.Count==KKCatStep+1)
return false;
int curScore = map[x, y];
//洞
if(curScore==-1)
return false;
//已经走过的路
if (CurRoad.Any(c => c.X == x && c.Y == y))
return false;
CurRoad.Push(new Coord(x,y));
//成功到达终点的路线
if (curScore == -3)
{
var score = CurRoad.Skip(1).Take(CurRoad.Count - 2).Sum(c => map[c.X, c.Y]);
if(score>LastScore)
{
LastScore = score;
var road = CurRoad.ToList();
road.Reverse();
NiceRoads.Add(road);
}
return true;
}
//走四方
if (NextStep(x + 1, y))
CurRoad.Pop();
if(NextStep(x, y + 1))
CurRoad.Pop();
if(NextStep(x - 1, y))
CurRoad.Pop();
if(NextStep(x, y - 1))
CurRoad.Pop();
return true;
}
发布在博客了:http://www.cnblogs.com/jinzhao/archive/2011/10/09/2203746.html
灰常强大
@天行健 自强不息:
大侠,还准备请您写一个实现了
这位朋友,这个贴子我想多放一些时间,看看有没有其它的解决办法!谢谢你的算法,我会在结贴的时候把豆分给你。
@Wid纬度:
嗯,我也很有兴趣,其实算法到了这个程度,基本精力都要花在数学的边界问题上来提高效率。我的程序在19后就很慢了,有几个思路但是限于手头时间,呵呵。
@Wid纬度: 这么暴力的方法都可以。
请问一下 备注2中的最大分数的分数指的是什么,是步数吗?
我想就是从起点到终点路过的所有路径中分数最大的路径。
我对这个问题的看法:
1、最小步数是从起点出发,只能向前和向下推进,得到16步
2、如果多于16步,则必须有一次以上的向后和向上的 的操作,所以,推进步数不可能为 奇数,楼主说17步的实现只能请 欧拉来完成。
3、要求找到最大分数的走法?步法数不确定的情况下,要求出最大分数?楼主,你学过数学没?
1、最小步数是从起点出发,只能向前和向下推进,得到16步
只要x不把路堵死,每个矩阵的最小步数是定死了的。
2、如果多于16步,则必须有一次以上的向后和向上的 的操作,所以,推进步数不可能为 奇数,楼主说17步的实现只能请 欧拉来完成。
。。。我倒是不能理解你的意思了,楼主说了不走刚走过的路,另外三个方向都可以走的,步数肯定是在x+y-2和x*y-2之间的,奇数也是可能的。
3、要求找到最大分数的走法?步法数不确定的情况下,要求出最大分数?楼主,你学过数学没?
最大分数应该指的是所有路径中最大分数的路径。
呵呵,这位同学提出的几点当然也很重要,对解决问题的人是一个帮助!
不过这位朋友也不要这般气势汹汹。“楼主,你学过数学没?” 其实我就是数学学院毕业的,原后做的开发,只是数学学得不太好,但是了也不至于到这位朋友说的这般地步!
不过还是谢谢你,相信你应该对算法也是比较感兴趣的!
分组,排序的过程。
回溯法
我计算出的结果在最大步数为16的时候结果为70,基本的做法是动态规划:dp[x][y][steps]保存的值是在走了steps步之后在[x][y]位置处能得到最大的得分。下面是具体的代码:
class node{
public int x, y, steps, score;
public node(int x, int y, int steps, int score){
this.x = x;
this.y = y;
this.steps = steps;
this.score = score;
}
}
public class Test {
static int[][] map = {{0, 1, 5, 2, 4, 5, 8, 2, 1},
{1, 5, 2, 4, 5, 8, 2,-1, 5},
{2, 7, 5, 2, 4, 5,-1, 2, 1},
{2, 1, 3, 2, -1,0, 8, 7, 3},
{2, 1, 5, 1, 9, 5, 2, 2, 1},
{4, 8, 4, 3, 4, 2, 8, 2, 3},
{2, 1, 5, 6, 4, 5, 7, 4, 1},
{2, 8, 7, 2, 4, 5, 8, 2, 1},
{1, 5, 5, 4, 5, 6, 2, 2, 0}};
static int[][][] dp = new int[9][9][100];
static node[] que;
static int head, tail;
static int max_steps = 16, result;
static int[][] t = {{1, 0}, {-1,0}, {0, 1}, {0,-1}};
static public void main(String[] arg){
int i, j, k, x, y, steps, score;
for(i = 0; i < 9; i++){
for(j = 0; j < 9; j++){
for(k = 0; k < 100; k++){
dp[i][j][k] = -1;
}
}
}
dp[0][0][0] = 0;
head = 0;
tail = 1;
result = -1;
que = new node[10000];
que[head] = new node(0, 0, 0, 0);
node tmp;
while(head < tail){
tmp = que[head++];
if(tmp.steps >= max_steps){
continue;
}
//向四个方向走
for(i = 0; i < 4; i++){
x = tmp.x+t[i][0];
y = tmp.y+t[i][1];
if(x < 0 || x > 8 || y < 0 || y > 8 || map[x][y] == -1){
continue;
}
steps = tmp.steps + 1;
score = tmp.score + map[x][y];
if(dp[x][y][steps] < score){
dp[x][y][steps] = score;
que[tail++] = new node(x, y, steps, score);
}
if(x == 8 && y == 8 && score > result){
result = score;
}
}
}
System.out.println(result);
}
}
如果结果不对还麻烦告诉一下,我也是花了十几分钟才写好的代码。。。
在步数限制为50的时候结果是325,刚才没看题目,如果是要求出所有满足条件的路径中的一种的话在上面的代码中稍改一下就可以记录下来了。