- BFS
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
● ○ ●
○ ● ○ ●
● ○ ● ○
○ ● ○
输入描述 Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述 Output Description
用最少的步数移动到目标棋局的步数。
样例输入 Sample Input
BWBO
WBWB
BWBW
WBWO
样例输出 Sample Output
5
#include <queue>
#include<iostream>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
struct Chess
{
char c[4][4];
char color;
int count;
};
int Length=0;
queue<Chess> Q;
Chess *C;
int Dir[][4]={{0,1},{1,0},{0,-1},{-1,0}};
bool isSame(Chess s1,Chess s2)
{
int i,j;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (s1.c[i][j]!=s2.c[i][j])
return false;
return true;
}
bool isResult(Chess s)
{
int i,j;
for (i=0;i<4;i++)
{
if ((s.c[i][0]==s.c[i][1]) && (s.c[i][0]==s.c[i][2]) && (s.c[i][0]==s.c[i][3]))
return true;
if ((s.c[0][i]==s.c[1][i]) && (s.c[0][i]==s.c[2][i]) && (s.c[0][i]==s.c[3][i]))
return true;
}
if ((s.c[0][0]==s.c[1][1]) && (s.c[0][0]==s.c[2][2]) && (s.c[0][0]==s.c[3][3]))
return true;
if ((s.c[0][3]==s.c[1][2]) && (s.c[0][3]==s.c[2][1]) && (s.c[0][3]==s.c[3][0]))
return true;
return false;
}
bool isValid(int x,int y)
{
if (x>3 || y>3 || x<0 || y<0)
return false;
return true;
}
void next(Chess s)
{
bool b;
Chess t;
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
if (s.c[i][j]=='O')
for (int k=0;k<4;k++)
{
t=s;
t.count++;
b=true;
if (isValid(i+Dir[k][0],j+Dir[k][1]) && s.c[i+Dir[k][0]][j+Dir[k][1]]!=s.color)
{
t.color=s.c[i+Dir[k][0]][j+Dir[k][1]];
t.c[i][j]=t.c[i+Dir[k][0]][j+Dir[k][1]];
t.c[i+Dir[k][0]][j+Dir[k][1]]='O';
for (int l=0;l<Length;l++)
if (isSame(t,C[l]))
{
b=false;
break;
}
if (b)
Q.push(t);
}
}
}
int main()
{
int i,j;
Chess c1;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
cin>>c1.c[i][j];
c1.count=0;
Q.push(c1);
while (!Q.empty())
{
c1=Q.front();
if (isResult(c1))
{
cout<<c1.count<<endl;
break;
}
Q.pop();
next(c1);
}
return 0;
}