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;
}

 

posted @ 2017-07-23 07:00  杀猪状元  阅读(149)  评论(0编辑  收藏  举报