您的位置:首页 > 其它

四子连棋

2016-07-02 18:21 316 查看
#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;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: