递归求骑士之旅问题,结果正确,却有问题,求救!

python与大数据分析
博客专家认证
2003-06-30 11:58:07
#include <stdio.h>
int step(int,int);
int next[2][8]={{2,1,-1,-2,-2,-1,1,2},{-1,-2,-2,-1,1,2,2,1}};
int chess[8][8]={0};
int counter;
main()
{
int i,j,x,y;
counter=1;
printf("Please input the initial location of the house(0--8)\n");
scanf("%d,%d",&x,&y);
chess[x][y]=1;
step(x,y);
for(i=0;i<8;i++)
{
for (j=0;j<8;j++)
printf("%3d",chess[i][j]);
printf("\n");
}
}
int step(int startx,int starty)
{
int i,nextx,nexty;
for(i=0;i<=7;i++)
{
nextx=startx+next[0][i];
nexty=starty+next[1][i];
if (isValid(nextx,nexty)==1)
{
counter++;
chess[nextx][nexty]=counter;
step(nextx,nexty);
}
}
}
int isValid(int x,int y)
{
if ((x>=0 && x<=7 && y>=0 && y<=7) && (chess[x][y]==0))
return 1;
return 0;
}
...全文
105 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
titainium 2003-07-07
  • 打赏
  • 举报
回复
呵呵,我最近就要做到这个题目了,借你这个参考一下。
Sunnyiez 2003-07-07
  • 打赏
  • 举报
回复
这道题,显然不是用回溯来做,如果我给你的不再只限于一个象棋盘,而是一个N*N 的棋盘,你的做法一点会超。用回溯做过,在zju上是0.83秒。如果用广度搜索,00:00啊!想想吧!
  • 打赏
  • 举报
回复
回溯就是返回上一次的状态呀!你就看看你这次试探做了些什么,在回溯时把你修改过的东西再改回去就行了。
if (isValid(nextx,nexty)==1)
{
counter++;
chess[nextx][nexty]=counter;
step(nextx,nexty); //这后面要有“counter--”呀!
}
如何写else时的回溯语句?我实在太笨了,有劳了
dingopeter 2003-07-05
  • 打赏
  • 举报
回复
你说个具体问题呀!上面那个问题我已经讲完了。结果也是正确的。你要我帮什么?
  • 打赏
  • 举报
回复
帮帮忙了,我不会改呀
dingopeter 2003-07-03
  • 打赏
  • 举报
回复
回溯就是返回上一次的状态呀!你就看看你这次试探做了些什么,在回溯时把你修改过的东西再改回去就行了。
  • 打赏
  • 举报
回复
不知道怎么回溯,递进时反而未容易一些
dingopeter 2003-07-01
  • 打赏
  • 举报
回复
"关于递归我觉得最难的是如何回溯"什么意思?
  • 打赏
  • 举报
回复
大家批评的好。
dingopeter(Peter) 说得我也注意到了,可程序不管怎么运行都是对的,是不是骑士无论怎么走都有遍历的可能。
能不能帮忙写一下怎么回溯,我实在想不起来
ljranby 2003-07-01
  • 打赏
  • 举报
回复
完全同意dingopeter老兄,你看得很认真呀!
  • 打赏
  • 举报
回复
关于递归我觉得最难的是如何回溯
dingopeter 2003-07-01
  • 打赏
  • 举报
回复
“无论怎么走都有遍历的可能”,这部分上是对的。
用马的问题测试回溯并不太合适。马的问题是一个公认的“试探法”的例子。就是说,在多数情况下,只要按照一个顺序走下去(也就是说,只要没走过的格子就去走),就能走完。只有在少数情况下(把马放在某个特定的格子里,而试探的顺序又不对),才会出现走不动的情况。所以你的程序不容易出错。(不信你可以在“step(nextx,nexty);”语句前后各加一个输出语句,看看有多少次回溯)在多数情况下,没有回溯。
NowCan 2003-07-01
  • 打赏
  • 举报
回复
回溯就是在失败后退一步,注意一定要退一步。
还有,这个8*8的解实在太多,直接这么回溯估计1天也算不完。
dingopeter 2003-06-30
  • 打赏
  • 举报
回复
还有风格上的问题。你应该把所有初始化工作放在一起。比如,你那句"counter=1"应该跟chess[x][y]=1; step(x,y);这些语句放在一起。不然我咋一眼看,还以为你没有对counter初始化呢。

而从软件工程的角度讲,counter不应该做成全局变量。应该放在函数“int step(int startx,int starty)”里,只要写成“static int counter=1;”,它就会只初始化一次(而不会每次执行函数时都被置1),而且不会因为退出函数而就被清零。
dingopeter 2003-06-30
  • 打赏
  • 举报
回复
还有一些小BUGs。比如下面这句:
printf("Please input the initial location of the house(0--8)\n"

准确的说,应该是“(0-7)”,而不是0-8。
还有,平常说的马是"horse"(而不是你的"house"),象棋里的“马”叫Knight.
dingopeter 2003-06-30
  • 打赏
  • 举报
回复
if (isValid(nextx,nexty)==1)
{
counter++;
chess[nextx][nexty]=counter;
step(nextx,nexty); //这后面要有“counter--”呀!
}

你在试探时把计数器加1,回溯的时候又不还原,当然会出错。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧