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.

posted @ 2012-01-30 02:00  翱翔的感觉  阅读(166)  评论(0)    收藏  举报