codevs1004

题目地址:http://codevs.cn/problem/1004/

分析:

搜索

代码:

const

  xp:array[1..4]of integer=(1,0,0,-1);

  yp:array[1..4]of integer=(0,1,-1,0);

var

  a:array[0..5,0..5] of integer;

  s:string;

  m,n,i,j,min:integer;

  

procedure dfs(x,y,num,bu:integer);

  var

    i,j,k,m:integer;

  begin

    if num>=min then exit;

    m:=10000;

    for i:=1 to 4 do

      begin

        if (a[i,1]=a[i,2])and(a[i,2]=a[i,3])and(a[i,3]=a[i,4])and((a[i,4]=1)or(a[i,4]=2)) then m:=num;

        if (a[1,i]=a[2,i])and(a[2,i]=a[3,i])and(a[3,i]=a[4,i])and((a[4,i]=1)or(a[4,i]=2)) then m:=num;

      end;

    if (a[1,1]=a[2,2])and(a[2,2]=a[3,3])and(a[3,3]=a[4,4])and((a[4,4]=1)or(a[4,4]=2)) then m:=num;

    if (a[1,4]=a[2,3])and(a[2,3]=a[3,2])and(a[3,2]=a[4,1])and((a[4,1]=1)or(a[4,1]=2)) then m:=num;              //判断是否四子连棋

    if m<min then

      begin

        min:=m;

        exit;

      end;

    for i:=4 downto 1 do

      begin

        if(x+xp[i]<5)and(x+xp[i]>0)and(y+yp[i]>0)and

                         (y+yp[i]<5)and(bu=a[x+xp[i],y+yp[i]]) then

        begin

          a[x,y]:=a[x+xp[i],y+yp[i]];

          a[x+xp[i],y+yp[i]]:=0;

          if bu=1 then bu:=2

            else bu:=1;

          for j:=1 to 4 do

            for k:=1 to 4 do

              if a[j,k]=0 then 

                dfs(j,k,num+1,bu);                                            //找到空的位置再深搜

          if bu=1 then bu:=2

            else bu:=1;

          a[x+xp[i],y+yp[i]]:=a[x,y];

          a[x,y]:=0;                                                                        //回溯

        end;

      end;

  end;

  

begin

  min:=10;

  for i:=1 to 4 do

    begin

      readln(s);

      for j:=1 to 4 do

        case s[j] of 

          'B':a[i,j]:=1;

          'W':a[i,j]:=2;

          'O':a[i,j]:=0;                              //读入存储

         end;

    end;

  for i:=1 to 4 do

    for j:=1 to 4 do

      if a[i,j]=0 then

        begin

          dfs(i,j,0,1);

          dfs(i,j,0,2);

        end;

  writeln(min);

end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值