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

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;
}
...全文
151 16 打赏 收藏 转发到动态 举报
写回复
用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,回溯的时候又不还原,当然会出错。
内容概要:本文围绕“基于超局部模型与自抗扰ESO观测器的无模型预测电流控制改进策略”展开研究,提出一种结合超局部模型(ULM)与扩张状态观测器(ESO)的无模型预测电流控制(MFPCC)改进方法,旨在提升永磁同步电机(PMSM)电流环的动态响应性能与抗干扰能力。该策略利用超局部模型对系统行为进行局部逼近,避免依赖精确数学模型,同时引入自抗扰控制中的ESO实时观测并补偿系统内外部扰动,有效抑制参数摄动、负载变化及模型不确定性带来的影响。研究通过Simulink搭建完整的控制系统仿真模型,对传统MFPCC与所提改进策略进行对比分析,验证了新方法在电流跟踪精度、响应速度和鲁棒性方面的优越性。; 适合人群:具备电机控制、现代控制理论及Simulink仿真基础的电气工程、自动化及相关专业的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高性能电机驱动系统中电流环控制器的设计与优化;②为无模型控制与自抗扰控制的融合应用提供技术参考;③支撑相关课题的仿真验证、论文复现与创新方法研究。; 阅读建议:建议读者结合Simulink仿真模型深入理解控制结构与参数整定过程,重点关注ESO的观测性能与扰动补偿机制,并可通过改变负载条件、参数偏差等工况进行鲁棒性测试,进一步掌握该改进策略的核心优势与适用边界。

33,026

社区成员

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

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