| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 764 人关注过本帖
标题:[求助]如何有效的实现回溯
只看楼主 加入收藏
ylc53
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-30
收藏
 问题点数:0 回复次数:6 
[求助]如何有效的实现回溯

骑士巡游问题:在nn列的棋盘上(如n=5),假设一位骑士(按象棋中“马走日”的行走法)从初始坐标位置(x1y1)出发,要遍访(巡游)棋盘中的每一个位置一次。请编一个程序,为骑士求解巡游“路线图”(或告诉骑士,从某位置出发时,无法遍访整个棋盘 问题无解)。

n=5时,意味着要在55列的棋盘的25个“点”处,按骑士行走规则,依次将12525个“棋子”(数码)分别摆放到棋盘上(摆满25个位置则成功,否则失败问题无解)。

例如,当n=5且初始坐标位置定为(11) 即最左上角的那个点时,如下是一种巡游“路线图”。程序执行后的输出结果为:

(x1,y1)? => (1=>5, 1=>5) : 1 1

1 6 15 10 21

14 9 20 5 16

19 2 7 22 11

8 13 24 17 4

25 18 3 12 23

编制主函数,让用户输入作为巡游起点的初始坐标位置(x1,y1)
下面是我的程序,但是没实现成功,不知道如何实现回溯。。。
请高手指点迷津!!!谢谢了
#include <iostream.h>
int a[5][5];
void solve(int i,int j,int k,bool& ok)
{
int g,h;
if(k==26)
ok=true;
else
{
if((i+2)>=0&&(j-1)>=0&&(i+2)<5&&(j-1)<5&&a[i+2][j-1]==0)
{
a[i+2][j-1]=k;
g=i+2,h=j-1;
solve(g,h,k+1,ok);
}
else if((i+2)>=0&&(j+1)>=0&&(i+2)<5&&(j+1)<5&&a[i+2][j+1]==0)
{
a[i+2][j+1]=k;
g=i+2,h=j+1;
solve(g,h,k+1,ok);
}
else if((i+1)>=0&&(j+2)>=0&&(i+1)<5&&(j+2)<5&&a[i+1][j+2]==0)
{
a[i+1][j+2]=k;
g=i+1,h=j+2;
solve(g,h,k+1,ok);
}
else if((i-1)>=0&&(j+2)>=0&&(i-1)<5&&(j+2)<5&&a[i-1][j+2]==0)
{
a[i-1][j+2]=k;
g=i-1,h=j+2;
solve(g,h,k+1,ok);
}
else if((i-2)>=0&&(j+1)>=0&&(i-2)<5&&(j+1)<5&&a[i-2][j+1]==0)
{
a[i-2][j+1]=k;
g=i-2,h=j+1;
solve(g,h,k+1,ok);
}
else if((i-2)>=0&&(j-1)>=0&&(i-2)<5&&(j-1)<5&&a[i-2][j-1]==0)
{
a[i-2][j-1]=k;
g=i-2,h=j-1;
solve(g,h,k+1,ok);
}
else if((i-1)>=0&&(j-2)>=0&&(i-1)<5&&(j-2)<5&&a[i-1][j-2]==0)
{
a[i-1][j-2]=k;
g=i-1,h=j-2;
solve(g,h,k+1,ok);
}
else if((i+1)>=0&&(j-2)>=0&&(i+1)<5&&(j-2)<5&&a[i+1][j-2]==0)
{
a[i+1][j-2]=k;
g=i+1,h=j-2;
solve(g,h,k+1,ok);
}
else
ok=false;
}
}
void main()
{
int x,y;
bool ok;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
a[i][j]=0;
cout<<"请选择从哪点骑士开始巡游(即哪个坐标):";
cin>>x;
cin>>y;
a[x-1][y-1]=1;
solve(x-1,y-1,2,ok);
// if(ok)
// {
for(int m=0;m<5;m++)
{
for(int n=0;n<5;n++)
{
cout<<a[m][n]<<" ";
}
cout<<endl;
}
// }
// else
// cout<<"false"<<endl;
}
搜索更多相关主题的帖子: 回溯 
2005-11-10 21:12
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
这个算法只能做一次判断,且又不能回头.所以它不能实现你想要的.
我的看法是.好象走迷宫一样,是不能走就回头一点,走其它的路,又走不通,就再回头一点,这样直到找到正确的路.用链表或堆栈实现这个效果会很好.

[此贴子已经被作者于2005-11-11 20:33:35编辑过]


=×&D o I p R e E n C g T l X&×=
2005-11-11 20:32
ylc53
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-30
收藏
得分:0 

版主说的就是回溯算法
但我不知道怎么去实现它。。。。

[此贴子已经被作者于2005-11-11 22:12:40编辑过]

2005-11-11 21:18
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
那需要我帮你完成吗?

=×&D o I p R e E n C g T l X&×=
2005-11-11 22:20
ylc53
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-30
收藏
得分:0 
呵呵
能说点具体点那更好
2005-11-11 23:56
ylc53
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-30
收藏
得分:0 

这个程序那个“马走日”算法是必须的
我存在的问题是不知道从哪入手去回溯。。。

2005-11-12 00:00
sailer
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2005-10-12
收藏
得分:0 
用栈实现,不断进行出栈,进栈操作。好象也很难啊。??

希望大家多多配合他人,多多帮助他人。 支持国家的 产品,尽量不买外国货。
2005-11-12 00:45
快速回复:[求助]如何有效的实现回溯
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016635 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved