poj2488
嗨,如此简单的深搜题目 我还是因为写方向表时的小错误浪费了 我两个多小时 真是有点眼高手低羞愧感诶......
poj评测:880k,32ms;
program knight;
type
sta=record
x,y:longint;
end;
var
dir:array[1..8,1..2]of integer=((-1,-2),(1,-2),(-2,-1),(2,-1) //方向表决定着按字典序输出答案
,(-2,1),(2,1),(-1,2),(1,2));
p,q,n,now:longint;
flag:boolean;//标记是否已经找到答案
v:array[1..26,1..26]of boolean;
bu:array[1..26*26]of sta;//存储答案
procedure shuchu;
var
i,j:longint;
begin
writeln('Scenario #',now,':');
for i:=1 to p*q do write(chr(bu[i].y+ord('A')-1),bu[i].x);writeln;
if now<>n then writeln; //最后一行不用输出空格,error中一样
end;
procedure error;
begin
writeln('Scenario #',now,':');
writeln('impossible');
if now<>n then writeln;
end;
procedure dfs(x,y,step:longint);
var
i,newx,newy:longint;
begin
if flag then exit;//没有这句一个问题将会有很多答案
if step=p*q+1 then begin flag:=true; shuchu;exit;end;
if (x>=1)and(x<=p)and(y>=1) and(y<=q) then
if (not v[x,y]) then begin
bu[step].x:=x;
bu[step].y:=y;
v[x,y]:=true;
for i:=1 to 8 do begin
newx:=x+dir[i,1];
newy:=y+dir[i,2];
dfs(newx,newy,step+1);
end;
v[x,y]:=false;
end;
end;
procedure main;
var
i,x,y:longint;
begin
assign(input,'knight.in');
assign(output,'knight.out');
reset(input);
rewrite(output);
readln(n);
for i:=1 to n do begin
now:=i;
readln(p,q);
flag:=false;
for y:=1 to q do //深搜入口
if not flag then
for x:=1 to p do begin
fillchar(v,sizeof(v),0);
fillchar(bu,sizeof(bu),0);
dfs(x,y,1);
end;
if not flag then error;
end;
close(output);
close(input);
end;
begin
main;
end.

浙公网安备 33010602011771号