• codevs 1004 四子连棋


    时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
    题目描述 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 <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    using namespace std;
    int ans=1,Map[5][5];
    bool flag=false;
    int fx[5]={1,-1,0,0},fy[5]={0,0,-1,1},x1,y1,x2,y2;
    bool check()
    {
        for(int i=1;i<=4;i++)
        {
            if(Map[i][1]==Map[i][2]&&Map[i][2]==Map[i][3]&&Map[i][3]==Map[i][4]) return true;
            if(Map[1][i]==Map[2][i]&&Map[2][i]==Map[3][i]&&Map[3][i]==Map[4][i]) return true;
        }
        if(Map[1][1]==Map[2][2]&&Map[2][2]==Map[3][3]&&Map[3][3]==Map[4][4]) return true;
        if(Map[4][1]==Map[3][2]&&Map[3][2]==Map[2][3]&&Map[2][3]==Map[1][4]) return true;
        return false;
    }
    void dfs(int a,int b,int c,int d,int now,int col)
    {
        if(check()) {printf("%d",ans);exit(0);}
        if(now>ans) return;
        for(int i=0;i<4;i++)
        {
            int aa=a+fx[i],bb=b+fy[i];
            if(aa>=1&&aa<=4&&bb>=1&&bb<=4&&Map[aa][bb]!=col)
            {
                swap(Map[a][b],Map[aa][bb]);
                dfs(aa,bb,c,d,now+1,Map[a][b]);
                swap(Map[a][b],Map[aa][bb]);
            }
            int cc=c+fx[i],dd=d+fy[i];
            if(cc>=1&&cc<=4&&dd>=1&&dd<=4&&Map[cc][dd]!=col)
            {
                swap(Map[c][d],Map[cc][dd]);
                dfs(a,b,cc,dd,now+1,Map[c][d]);
                swap(Map[c][d],Map[cc][dd]);
            }
        }
    }
    int main()
    {
        for(int i=1;i<=4;i++)
        {
            char ch;
            for(int j=1;j<=4;j++)
            {
                cin>>ch;
                if(ch=='B') Map[i][j]=1;
                if(ch=='W') Map[i][j]=2;
                if(ch=='O')
                {
                    if(flag==false)
                    {
                        x1=i;
                        y1=j;
                        flag=true;
                    }
                    else if(flag==true)
                    {
                        x2=i;
                        y2=j;
                    }
                    Map[i][j]=3;
                }
            }
        }
        for(;ans;ans++)
        {
            dfs(x1,y1,x2,y2,1,1);
            dfs(x1,y1,x2,y2,1,2);
        }
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    第一次sprint团队贡献分改
    第一个Sprint冲刺事后诸葛报告
    第一个Sprint冲刺第十天
    第一个Sprint冲刺第九天
    第一个Sprint冲刺第八天
    第一个Sprint冲刺第七天
    第一个Sprint冲刺第六天
    第一个Sprint冲刺第五天
    第一个Sprint冲刺第四天
    第一个Sprint冲刺第三天
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7223510.html
Copyright © 2020-2023  润新知