zoukankan      html  css  js  c++  java
  • 1004 四子连棋

    题目描述 Description

    在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。

     
     
    输入描述 Input Description
    从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
    输出描述 Output Description

    用最少的步数移动到目标棋局的步数。

    样例输入 Sample Input

    BWBO
    WBWB
    BWBW
    WBWO

    样例输出 Sample Output

    5

    数据范围及提示 Data Size & Hint

    hi

     
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int a[5][5]={0},ans=100;
    int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0};
    void dfs(int x,int y,int sum,int bj)
    {
        int xn,yn,minn=0x7fffffff;
        if (sum >= ans) return ;//返回上一层,查找是否还有更优解
        for (int q=1;q<=4;q++)//枚举满足条件的情况 
          {
              if (a[q][1]==a[q][2]&&a[q][2]==a[q][3]&&a[q][3]==a[q][4]&&(a[q][1]==1||a[q][1]==2)) minn=sum ;
              if (a[1][q]==a[2][q]&&a[2][q]==a[3][q]&&a[3][q]==a[4][q]&&(a[1][q]==1||a[1][q]==2)) minn=sum ;
          }
        if (a[1][1]==a[2][2]&&a[2][2]==a[3][3]&&a[3][3]==a[4][4]&&(a[1][1]==1||a[1][1]==2)) minn=sum ;
        if (a[1][4]==a[2][3]&&a[2][3]==a[3][2]&&a[3][2]==a[4][1]&&(a[1][4]==1||a[1][4]==2)) minn=sum ;
        if (minn<ans)
          {
              ans=minn;
              return ;//返回上一层,查找是否还有更优解 
          }
        for (int q=1;q<=4;q++)
          {
                xn=x+xx[q];yn=y+yy[q];
                if (xn>0&&xn<5&&yn>0&&yn<5&&a[xn][yn]==bj)
                {
                    a[x][y]=a[xn][yn];
                    a[xn][yn]=0;
                    bj=bj==1?2:1;//黑白棋交替行走 
                    for (int i=1;i<=4;i++)
                      for (int j=1;j<=4;j++)
                        if (!a[i][j]) dfs (i,j,sum+1,bj);
                    bj=bj==1?2:1;//恢复原状态 
                    a[xn][yn]=a[x][y];
                    a[x][y]=0;
                } 
                  
          }
          
           
    }
    int main()
    {
        for (int i=1;i<=4;i++)
          for (int j=1;j<=4;j++)
            {
                char ch;
                cin>>ch;
                if (ch=='B') a[i][j]=1;
                if (ch=='W') a[i][j]=2; 
            }
        for (int i=1;i<=4;i++)
          for (int j=1;j<=4;j++)
            if (!a[i][j])
              {
                   dfs (i,j,0,1);
                   dfs (i,j,0,2);
              }
        printf("%d",ans);
        return 0;
    }
    华丽丽的深搜
    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    【linux 文件管理】7-文件重定向
    by David Bombal CCNA with kali linux
    【linux 文件管理】6-软链接和硬链接
    13.mysql索引的使用
    11.mysql SQL优化之SQL问题定位
    mysql服务常用命令
    10.mysql存储引擎
    9. Mysql的体系结构概览
    8.mysql触发器
    项目上线部署
  • 原文地址:https://www.cnblogs.com/sjymj/p/5829905.html
Copyright © 2011-2022 走看看