深搜,广搜,回溯随便你,基本都能实现,简单剪枝就应该不会爆
这个是回溯
const max=10; {棋盘最大max*max}
dx:array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1); {8个方向的增量数组}
dy:array[1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
var n,x,y,x1,y1,step,k,i,sum:integer;
b:array[0..max*max] of integer; {记录每步跳的方向}
a:array[1..max,1..max] of integer; {棋盘状态,0—未遍历,1..n*n—遍历步号}
begin
write('input n= ');readln(n); {输入实际棋盘的状态}
write('input x,y= ');readln(x,y); {出发点}
step:=0; {当前跳到哪一步}
k:=0; {方向}
for i:=0 to n*n do b[i]:=0;
for x1:=1 to n do
for y1:=1 to n do
a[x1,y1]:=0; {以上为初始化}
a[x,y]:=1; {开始}
while (b[0]=0) and (step
k:=k+1;
if k>8 then begin {当前这一步没有方向可跳了,则回溯}
a[x,y]:=0;
k:=b[step]; {找到这一步的方向}
step:=step-1; {找到上一步}
x:=x-dx[k];
y:=y-dy[k]; {根据这一步的方向,找到上一步的位置}
end
else begin {按这个方向跳}
x:=x+dx[k];
y:=y+dy[k];
if (x<1) or (x>n) or (y<1) or (y>n) or (a[x,y]>0) then
begin {越界}
x:=x-dx[k];
y:=y-dy[k];
end
else
begin {前进}
step:=step+1;
a[x,y]:=step+1;
b[step]:=k;
k:=0;
end
end
end;
sum:=0; {判断是否n*n个格子中填满1..n*n这些数}
for y1:=1 to n do
for x1:=1 to n do
sum:=sum+a[x1,y1];
if sum<>((n*n*n*n+n*n) div 2) then writeln('no!') {不是,则无解}
else for y1:=1 to n do {否则输出一个解}
begin
for x1:=1 to n do write(a[x1,y1]:3);
writeln;
end;
readln;
end.
画外音:你需要代码么?有时间限制吗?
才8*8的方格用深度优先搜索比较好
显然dfs
我写的是深搜回溯的程序,输出的是一张表格,每个棋盘格子里的数字代表这个格子是第几步被跳过的
const max=10; {棋盘最大max*max}
dx:array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1); {8个方向的增量数组}
dy:array[1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
var n,x,y,x1,y1,step,k,i,sum:integer;
b:array[0..max*max] of integer; {记录每步跳的方向}
a:array[1..max,1..max] of integer; {棋盘状态,0—未遍历,1..n*n—遍历步号}
begin
write('input n= ');readln(n); {输入实际棋盘的状态}
write('input x,y= ');readln(x,y); {出发点}
step:=0; {当前跳到哪一步}
k:=0; {方向}
for i:=0 to n*n do b[i]:=0;
for x1:=1 to n do
for y1:=1 to n do
a[x1,y1]:=0; {以上为初始化}
a[x,y]:=1; {开始}
while (b[0]=0) and (step
k:=k+1;
if k>8 then begin {当前这一步没有方向可跳了,则回溯}
a[x,y]:=0;
k:=b[step]; {找到这一步的方向}
step:=step-1; {找到上一步}
x:=x-dx[k];
y:=y-dy[k]; {根据这一步的方向,找到上一步的位置}
end
else begin {按这个方向跳}
x:=x+dx[k];
y:=y+dy[k];
if (x<1) or (x>n) or (y<1) or (y>n) or (a[x,y]>0) then
begin {越界}
x:=x-dx[k];
y:=y-dy[k];
end
else
begin {前进}
step:=step+1;
a[x,y]:=step+1;
b[step]:=k;
k:=0;
end
end
end;
sum:=0; {判断是否n*n个格子中填满1..n*n这些数}
for y1:=1 to n do
for x1:=1 to n do
sum:=sum+a[x1,y1];
if sum<>((n*n*n*n+n*n) div 2) then writeln('no!') {不是,则无解}
else for y1:=1 to n do {否则输出一个解}
begin
for x1:=1 to n do write(a[x1,y1]:3);
writeln;
end;
readln;
end.