chess

吐槽这道题。。。好烦燥。。。goto在pascal里面超时了啊!!!goto你妹啊。。。

题目大意:这个游戏是两个人轮流在4*4的格子中放棋子,一个人放满了一行或一列或一个对角线就算赢。

现在,小秋秋用X先手,已经下过许多步了。他想知道自己现在是否有必胜策略,以及最小的字典序走法。

完全的裸搜,但是要判断它是不是必胜策略的话,不管别人怎么走你都要赢才行。

program Neayo;uses sysutils;
const
        inf='chess.in';
        ouf='chess.out';
var
        f:array[1..4,1..4]of longint;
        i,j,ansx,ansy:longint;
        win,lose:boolean;

function judge(x:longint):boolean;
var num:longint;
begin
     for i:=1 to 4 do
     begin
          num:=0;
          for j:=1 to 4 do
          if f[i,j]=x then inc(num) else break;
          if num=4 then exit(true);
          num:=0;
          for j:=1 to 4 do
          if f[j,i]=x then inc(num) else break;
          if num=4 then exit(true);
     end;
     num:=0;
     for i:=1 to 4 do
     if f[i,i]=x then inc(num) else break;
     if num=4 then exit(true);
     num:=0;
     for i:=1 to 4 do
     if f[i,5-i]=x then inc(num) else break;
     if num=4 then exit(true);
     exit(false);
end;
function dfs(time:longint):boolean;
var i,j,x,y:longint;
label 2;
begin
     for i:=1 to 4 do
      for j:=1 to 4 do
           if f[i,j]=-1 then
           begin
                f[i,j]:=1;
                if judge(1) then begin f[i,j]:=-1;exit(true);end;
                for x:=1 to 4 do
                 for y:=1 to 4 do
                 if f[x,y]=-1 then
                 begin
                      f[x,y]:=0;
                      if (judge(0))or(not dfs(time+1))then goto 2;
                      f[x,y]:=-1;
                 end;
                f[i,j]:=-1;
                exit(true);
                2:begin
                       f[i,j]:=-1;
                       f[x,y]:=-1;
                  end;
           end;
     exit(false);
end;
procedure init;
var ch:char;st:string;
x,y,i,j:longint;
label 1,2,3;
begin
     assign(output,ouf);assign(input,inf);
     reset(input);rewrite(output);
     readln(ch);
     while ch<>'$' do
     begin
          fillchar(f,sizeof(f),$ff);
          for i:=1 to 4 do
           begin
                readln(st);
                for j:=1 to 4 do
                begin
                     ch:=st[j];
                     if ch='o'then f[i,j]:=0;
                     if ch='x'then f[i,j]:=1;
                end;
           end;
          for i:=1 to 4 do
           for j:=1 to 4 do
           if f[i,j]=-1 then
           begin
                f[i,j]:=1;
                if judge(1) then goto 1;
                for x:=1 to 4 do
                 for y:=1 to 4 do
                 if f[x,y]=-1 then
                 begin
                      f[x,y]:=0;
                      if (judge(0))or(not dfs(0))then goto 2;
                      f[x,y]:=-1;
                 end;
                goto 1;
                2:begin
                       f[i,j]:=-1;
                       f[x,y]:=-1;
                  end;
           end;

          writeln('#####');
          goto 3;
          1:writeln('(',i-1,',',j-1,')');
          3:ch:=ch;
          readln(ch);
     end;
     close(input);
end;

begin
     init;
     close(output);
end.                                    
posted @ 2012-10-14 20:08  neayo  阅读(230)  评论(0编辑  收藏  举报