首页 新闻 会员 周边 捐助

求一算法实现(最好用c#)

0
悬赏园豆:80 [已解决问题] 解决于 2011-11-09 19:28

备注

1:规定的步数是指可以确保能够到达的步数

  比如:多起点到终点要求在5步内到达显然是不可能的,程序最好能够有所提示。

              最小的步数可能是16步,所以了当步数是16步的时候怎么实现上面的一些条件,当步数为17的时候又怎么实现?

2:要求找到最大分数的走法

想了很久,能力有限还是无法解决。希望各路高手帮忙!

Wid纬度的主页 Wid纬度 | 初学一级 | 园豆:60
提问于:2011-10-09 09:58
< >
分享
最佳答案
0

终于看到很感兴趣的算法题,呵呵,动手试试~

        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

收获园豆:70
today4king | 老鸟四级 |园豆:3499 | 2011-10-09 13:37

灰常强大

artwl | 园豆:16736 (专家六级) | 2011-10-09 16:50

@天行健 自强不息:

大侠,还准备请您写一个实现了 

Wid纬度 | 园豆:60 (初学一级) | 2011-10-09 17:14

这位朋友,这个贴子我想多放一些时间,看看有没有其它的解决办法!谢谢你的算法,我会在结贴的时候把豆分给你。

Wid纬度 | 园豆:60 (初学一级) | 2011-10-10 09:13

@Wid纬度:

嗯,我也很有兴趣,其实算法到了这个程度,基本精力都要花在数学的边界问题上来提高效率。我的程序在19后就很慢了,有几个思路但是限于手头时间,呵呵。

today4king | 园豆:3499 (老鸟四级) | 2011-10-10 11:46

@Wid纬度: 这么暴力的方法都可以。

GG大婶 | 园豆:215 (菜鸟二级) | 2011-11-09 19:56
其他回答(5)
0

请问一下 备注2中的最大分数的分数指的是什么,是步数吗?

Apple丫头 | 园豆:451 (菜鸟二级) | 2011-10-09 10:40

我想就是从起点到终点路过的所有路径中分数最大的路径。

支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2011-10-09 13:31
0

我对这个问题的看法:

1、最小步数是从起点出发,只能向前和向下推进,得到16步

2、如果多于16步,则必须有一次以上的向后和向上的 的操作,所以,推进步数不可能为 奇数,楼主说17步的实现只能请 欧拉来完成。

3、要求找到最大分数的走法?步法数不确定的情况下,要求出最大分数?楼主,你学过数学没?

dreamsky0001 | 园豆:205 (菜鸟二级) | 2011-10-09 10:42

1、最小步数是从起点出发,只能向前和向下推进,得到16步

只要x不把路堵死,每个矩阵的最小步数是定死了的。

2、如果多于16步,则必须有一次以上的向后和向上的 的操作,所以,推进步数不可能为 奇数,楼主说17步的实现只能请 欧拉来完成。

。。。我倒是不能理解你的意思了,楼主说了不走刚走过的路,另外三个方向都可以走的,步数肯定是在x+y-2和x*y-2之间的,奇数也是可能的。

3、要求找到最大分数的走法?步法数不确定的情况下,要求出最大分数?楼主,你学过数学没?

最大分数应该指的是所有路径中最大分数的路径。

支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2011-10-09 13:37

呵呵,这位同学提出的几点当然也很重要,对解决问题的人是一个帮助!

不过这位朋友也不要这般气势汹汹。“楼主,你学过数学没?” 其实我就是数学学院毕业的,原后做的开发,只是数学学得不太好,但是了也不至于到这位朋友说的这般地步!

不过还是谢谢你,相信你应该对算法也是比较感兴趣的!

支持(0) 反对(0) Wid纬度 | 园豆:60 (初学一级) | 2011-10-09 15:33
0

分组,排序的过程。

Tedy | 园豆:220 (菜鸟二级) | 2011-10-09 10:52
0

回溯法

artwl | 园豆:16736 (专家六级) | 2011-10-09 10:58
0

我计算出的结果在最大步数为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);
}
}

如果结果不对还麻烦告诉一下,我也是花了十几分钟才写好的代码。。。

收获园豆:10
GG大婶 | 园豆:215 (菜鸟二级) | 2011-10-11 16:25

在步数限制为50的时候结果是325,刚才没看题目,如果是要求出所有满足条件的路径中的一种的话在上面的代码中稍改一下就可以记录下来了。

支持(0) 反对(0) GG大婶 | 园豆:215 (菜鸟二级) | 2011-10-11 16:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册