回 帖 发 新 帖 刷新版面

主题:[讨论]骑士游历问题


在n*n的国际象棋棋盘的某一位置(p,q)有一个马,用“马走日字”的规则,要求它不重复地走完所有格子。
输入:
n p q
输出:
一个n*n的矩阵,表示每个格子是第几个走到。


请问,这道大家很熟悉的题目除了回溯还有别的方法吗?

如有,最好有程序。谢谢![em1][em1]

回复列表 (共20个回复)

沙发

不知.我只知道只有回朔能做.
如果说其他方法,大概只有WARSHALL能做了吧...
听说做法简单,但想起来非常难..~~~~
只有不到十行程序,但这种方法很难做,我都只是半懂.......
呜~~太难了

板凳


说说看?我还一点都不懂呢!

3 楼

引用:我都只是半懂.......
其实我都不太会,你可以上网找一下资料,但可能它讲得太深奥,难懂.

4 楼


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 楼

深度优先搜索(回溯)

6 楼


呵呵,这个我懂,我是说还有没有别的方法?

另外,那个WARSHALL有谁能翻译一下?不胜感激!!

7 楼

其实会回朔就可以了,那个WARSHALL其实很难...我晕

8 楼


那是!

9 楼

用回朔怎么做?是不是以下内容?
从(p,q)开始,依次寻找8个走“日”字的路线是否可走(目标位置未走过并且在棋盘内),若可走,记上这步,往下走。若8个路线都不可走,退回上一步。从上一步的路线的下一个路线开始搜寻。直到步数等于总格子数为止。

程序我还在思考。

10 楼

没错,可我的程序那里错了?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.

我来回复

您尚未登录,请登录后再回复。点此登录或注册