四子连棋

来源:互联网 发布:淘宝网商城儿童鞋 编辑:程序博客网 时间:2024/06/05 15:55
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#define hash 18000000
using namespace std;
struct hhh{
int a[17], bu, zou;
};
queue<hhh>q;
int fw[4]={4,-4,1,-1}, pd[hash];
bool check(int x[])
{
int d, k;
if(x[1]==x[6]&&x[6]==x[11]&&x[11]==x[16]) return 1;
if(x[4]==x[7]&&x[7]==x[10]&&x[10]==x[13]) return 1;
for(int i=0;i<4;i++)
{
d=0;k=0;
for(int j=1;j<4;j++)
{
if(x[4*i+j]==x[4*i+j+1]) d++;
if(x[i+4*j-3]==x[i+4*j+1]) k++;
}
if(d==3) return 1;
if(k==3) return 1;
}
return 0;
}
bool pp(int x, int y)
{
if(y==4) return x<13;
if(y==-4) return x>4;
if(y==1) return x%4;
if(y==-1) return (x-1)%4;
}
int turn(int a[])
{
int s=0;
for(int i=1;i<16;i++)
s+=a[i]*pow(3,i-1);
return s;
}
int main()
{
hhh fir;char c;
memset(pd, 0,sizeof(pd));
for(int i=1;i<=16;i++)
{
cin>>c;
if(c=='B') fir.a[i]=1;
else if(c=='W') fir.a[i]=0;
else if(c=='O') fir.a[i]=2;
}
fir.bu=0;
fir.zou=0;
q.push(fir);
fir.zou=1;
q.push(fir);
while(true)
{
hhh d=q.front();
if(check(d.a)==1){
cout<<d.bu<<endl;
break;
}
d.bu++;
for(int i=1;i<=16;i++)
{
if(d.a[i]==2)
for(int j=0;j<4;j++)
{
if(pp(i,fw[j])==1&&d.a[i+fw[j]]!=2&&d.zou!=d.a[i+fw[j]])
{
swap(d.a[i], d.a[i+fw[j]]);
d.zou=!d.zou;
int k=turn(d.a);
if(pd[k]==0)
{
pd[k]=1;
q.push(d);
}
d.zou=!d.zou;
swap(d.a[i], d.a[i+fw[j]]);
}
}
}
q.pop();
}
return 0;
1 0
原创粉丝点击