主题:[讨论]骑士游历问题
cmy28
[专家分:380] 发布于 2007-07-15 19:52:00
在n*n的国际象棋棋盘的某一位置(p,q)有一个马,用“马走日字”的规则,要求它不重复地走完所有格子。
输入:
n p q
输出:
一个n*n的矩阵,表示每个格子是第几个走到。
请问,这道大家很熟悉的题目除了回溯还有别的方法吗?
如有,最好有程序。谢谢![em1][em1]
回复列表 (共20个回复)
沙发
abcwuhang [专家分:1840] 发布于 2007-07-15 20:12:00
不知.我只知道只有回朔能做.
如果说其他方法,大概只有WARSHALL能做了吧...
听说做法简单,但想起来非常难..~~~~
只有不到十行程序,但这种方法很难做,我都只是半懂.......
呜~~太难了
板凳
cmy28 [专家分:380] 发布于 2007-07-15 20:16:00
说说看?我还一点都不懂呢!
3 楼
abcwuhang [专家分:1840] 发布于 2007-07-15 20:30:00
引用:我都只是半懂.......
其实我都不太会,你可以上网找一下资料,但可能它讲得太深奥,难懂.
4 楼
cmy28 [专家分:380] 发布于 2007-07-15 21:41:00
void warshell(int (*p)[20],int n)
{
if(n>20)
printf("错误:行数(列数)必须小于20");
else
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(p[j][i]==1)
for(int k=0;k<n;k++)
{
p[j][k]=p[j][k]+p[i][k];
if(p[j][k]==2)
p[j][k]=1;
}
}
}
}
我只找到了C++的,给翻译一下吧,让我看得懂。
5 楼
游侠UFO [专家分:1200] 发布于 2007-07-15 23:42:00
深度优先搜索(回溯)
6 楼
cmy28 [专家分:380] 发布于 2007-07-16 10:59:00
呵呵,这个我懂,我是说还有没有别的方法?
另外,那个WARSHALL有谁能翻译一下?不胜感激!!
7 楼
abcwuhang [专家分:1840] 发布于 2007-07-16 17:26:00
其实会回朔就可以了,那个WARSHALL其实很难...我晕
8 楼
cmy28 [专家分:380] 发布于 2007-07-16 20:04:00
那是!
9 楼
Matodied [专家分:7560] 发布于 2007-07-16 20:41:00
用回朔怎么做?是不是以下内容?
从(p,q)开始,依次寻找8个走“日”字的路线是否可走(目标位置未走过并且在棋盘内),若可走,记上这步,往下走。若8个路线都不可走,退回上一步。从上一步的路线的下一个路线开始搜寻。直到步数等于总格子数为止。
程序我还在思考。
10 楼
cmy28 [专家分:380] 发布于 2007-07-16 20:44:00
没错,可我的程序那里错了?MMD!
Program p260;
type
btype=array[1..100,1..100]of integer;
atype=array[1..8,1..2]of integer;
var
n,sqn,i,k,p,q:integer;
b:btype;
a:atype;
o:boolean;
procedure work(b:btype;i,p,q,k:integer);
var
p1,q1:integer;
procedure print;
var
i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(b[i,j],' ');
writeln;
end;
end;
begin
if i=sqn+1 then begin print;halt;end;
repeat
inc(k);
p1:=p+a[k,1];
q1:=q+a[k,2];
if (p1>0)and(p1<=n)and(q1>0)and(q1<=n)and(b[p1,q1]=0) then begin
b[p1,q1]:=i;
inc(i);
work(b,i,p1,q1,0);
dec(i);
end
until (k=8);
if i=2 then writeln('no solution!');
end;
procedure init;
begin
readln(n);
readln(p,q);
sqn:=sqr(n);
a[8,1]:=-2;a[8,2]:=1;
a[7,1]:=-2;a[7,2]:=-1;
a[6,1]:=-1;a[6,2]:=2;
a[5,1]:=-1;a[5,2]:=-2;
a[4,1]:=1;a[4,2]:=2;
a[3,1]:=1;a[3,2]:=-2;
a[2,1]:=2;a[2,2]:=1;
a[1,1]:=2;a[1,2]:=-1;
b[p,q]:=1;i:=2;
end;
begin
init;
work(b,i,p,q,0);
end.
我来回复