首页 > 其他 > 详细

codevs1004四子连棋

时间:2017-02-18 16:42:18      阅读:197      评论:0      收藏:0      [点我收藏+]

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

 
技术分享
#include<iostream>
#include<cstdio>
#include<cstdio>

using namespace std;
int map[5][5],ans,flag;
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
inline void dfs(int ch, int deep);

inline void swap(int &a,int &b)
{
    int t = a;
    a = b;
    b = t;
}

bool check()//判断是否符合条件 
{
    for (int k=1;k<=4;k++)
    {
        if (map[k][1]==map[k][2]&&map[k][2]==map[k][3]&&map[k][3]==map[k][4])return 1;
        if (map[1][k]==map[2][k]&&map[2][k]==map[3][k]&&map[3][k]==map[4][k])return 1;
    }
    if (map[1][1]==map[2][2]&&map[2][2]==map[3][3]&&map[3][3]==map[4][4])return 1;
    if (map[1][4]==map[2][3]&&map[2][3]==map[3][2]&&map[3][2]==map[4][1])return 1;
    return 0;
}

void move(int ch,int deep,int x,int y) //ch表示下一个颜色 
{
    for(int i=1;i<=4;i++)
    {
        int xx=x+dx[i],yy=y+dy[i];
        if(map[xx][yy]==ch&&xx>0&&xx<5&&yy>0&&yy<5)
        {
            swap(map[x][y],map[xx][yy]);
            dfs(ch,deep+1);
            swap(map[x][y],map[xx][yy]);
        }
    }
}

void dfs(int ch,int deep)
{
    int next=!ch;
    if(flag) return;
    if(ans==deep)
    {
        if(check()) flag=1;
        return;
    }
    for(int i=1;i<=4;i++)
      for(int j=1;j<=4;j++)
        if(map[i][j]==-1) move(next,deep,i,j);
}

int main()
{
    for(int i = 1; i <= 4; i++)
           for(int j = 1; j <= 4; j++)
           {
               char a;
               cin>>a;
               if(a == B) map[i][j] = 1;
               if(a == O) map[i][j] = -1;
           }
    for(ans = 1; flag == 0; ans++)
    {
        dfs(0, 0);
        if(flag) break;
        dfs(1, 0);
        if(flag) break;
    }
    printf("%d\n",ans);
}
dfs

 

codevs1004四子连棋

原文:http://www.cnblogs.com/L-Memory/p/6413302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!