您的位置:首页 > 其它

四子棋

2016-03-06 00:57 246 查看
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <string.h>
using namespace std;
int move[4][2]=
{
0,1,
0,-1,
1,0,
-1,0
};
const int Max=16;
int pow[Max];
const int Maxnum=2266980*2;
//180410
int Final[Maxnum];
int num[Maxnum];
map<int,int> mapnum;
int count1=0;

vector<int> vecnext[Maxnum];
int losenum[Maxnum];
vector<int> vecbefore[Maxnum];
vector<int> lose0[2];
vector<int> lose1[2];
vector<int> win0[2];
vector<int> win1[2];
bool OK(int sta)
{
bool b=sta&1;
sta/=2;
int num0=0,num1=0;
for(int i=0; i<Max; i++)
{
if(sta%3==0)
num0++;
else if (sta%3==1)
num1++;
sta/=3;
}
if(num0<=1&&num1<=1)
return false;
if(num0>4||num1>4)
return false;
if(num0<=1&&b==1)
return false;
if(num1<=1&&b==0)
return false;
if(num0<=1)
Final[count1]=1,lose0[0].push_back(count1);
if(num1<=1)
Final[count1]=0,lose1[0].push_back(count1);
return true;
}
struct point
{
int x,y;
point(int a,int b)
{
x=a;
y=b;
}
};
void checkup(int board[][4],int x,int y,int b)
{
if(board[x][0]==1-b && board[x][1]==b && board[x][2]==b && board[x][3]==-1)
board[x][0]=-1;
if(board[x][0]==-1 && board[x][1]==1-b && board[x][2]==b && board[x][3]==b)
board[x][1]=-1;
if(board[x][0]==b && board[x][1]==b && board[x][2]==1-b && board[x][3]==-1)
board[x][2]=-1;
if(board[x][0]==-1 && board[x][1]==b && board[x][2]==b && board[x][3]==1-b)
board[x][3]=-1;

if(board[0][y]==1-b && board[1][y]==b && board[2][y]==b && board[3][y]==-1)
board[0][y]=-1;
if(board[0][y]==-1 && board[1][y]==1-b && board[2][y]==b && board[3][y]==b)
board[1][y]=-1;
if(board[0][y]==b && board[1][y]==b && board[2][y]==1-b && board[3][y]==-1)
board[2][y]=-1;
if(board[0][y]==-1 && board[1][y]==b && board[2][y]==b && board[3][y]==1-b)
board[3][y]=-1;
}
bool inboard(int x,int y)
{
return x>=0&&x<4&&y>=0&&y<4;
}
int converToState(int board[][4])
{
int ans=0;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
{
if(board[i][j]==-1)
ans+=pow[i*4+j]*2;
else
ans+=pow[i*4+j]*board[i][j];
}
return ans;
}
void setnext(int sta)
{
int mapsta=mapnum[sta];
int board[4][4];
memset(board,-1,sizeof board);
int now=sta/2;
int b=sta&1;
if(Final[mapsta]!=-1)
return ;
vector<point> pieces;
for(int i=0; i<Max; i++)
{
if(now%3!=2)
board[i/4][i%4]=now%3;
if(now%3==b)
pieces.push_back(point(i/4,i%4));
now/=3;
}
bool flag=0;
for(int i=0; i<pieces.size(); i++)
{
for(int j=0; j<4; j++)
{
int x=pieces[i].x+move[j][0];
int y=pieces[i].y+move[j][1];

if(!inboard(x,y)||board[x][y]!=-1)
continue;
flag=1;
int board2[4][4];
memcpy(board2,board,sizeof board);
board2[pieces[i].x][pieces[i].y]=-1;
board2[x][y]=b;
checkup(board2,x,y,b);
int newState=converToState(board2)*2+1-b;
vecnext[mapsta].push_back(mapnum[newState]);
vecbefore[mapnum[newState]].push_back(mapsta);
}
}
if(flag==0)
{
if(b==0)
{
lose0[0].push_back(mapsta);
}
if(b==1)
{
lose1[0].push_back(mapsta);
}
}
}

void init()
{
memset(Final,-1,sizeof Final);
for(int i=0; i<=2*(pow[Max-1]*3-1); i++)
{
if(OK(i))
num[count1]=i,mapnum[i]=count1++;
}
for(int i=0; i<count1; i++)
{
setnext(num[i]);
}
int p=0;
while(true)
{
bool flag=1;
for(int i=0; i<lose0[p].size(); i++)
{
int t=lose0[p][i];
for(int j=0; j<vecbefore[t].size(); j++)
{
int now=vecbefore[t][j];
if(Final[now]!=-1)
continue;

Final[now]=1;
win1[p^1].push_back(now);
flag=0;
}
}
for(int i=0; i<lose1[p].size(); i++)
{
int t=lose1[p][i];
for(int j=0; j<vecbefore[t].size(); j++)
{
int now=vecbefore[t][j];
if(Final[now]!=-1)
continue;
Final[now]=0;
win0[p^1].push_back(now);
flag=0;
}
}
for(int i=0; i<win0[p].size(); i++)
{
int t=win0[p][i];
for(int j=0; j<vecbefore[t].size(); j++)
{
int now=vecbefore[t][j];
if(Final[now]!=-1)
continue;
losenum[now]++;
if(losenum[now]==vecnext[now].size())
{
Final[now]=0;
lose1[p^1].push_back(now);
flag=0;
}
}
}
for(int i=0; i<win1[p].size(); i++)
{
int t=win1[p][i];
for(int j=0; j<vecbefore[t].size(); j++)
{
int now=vecbefore[t][j];
if(Final[now]!=-1)
continue;
losenum[now]++;
if(losenum[now]==vecnext[now].size())
{
Final[now]=1;
lose0[p^1].push_back(now);
flag=0;
}
}
}
lose0[p].clear();
lose1[p].clear();
win0[p].clear();
win1[p].clear();
if(flag)
break;
p^=1;
}
}

int main(int argc, char *argv[])
{
pow[0]=1;
for(int i=1; i<Max; i++)
pow[i]=pow[i-1]*3;
//freopen("read.txt", "r" , stdin);
int sta=0;
init();
cout<<sta<<endl;
int ans0=0,ans1=0;
while(true)
{
sta=0;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
{
int a;
cin>>a;
if(a==0)
sta+=pow[i*4+j]*2;
if(a==2)
sta+=pow[i*4+j]*1;
}
int b;cin>>b;
sta=sta*2+b;
int ne=mapnum[sta];
cout<<vecnext[ne].size()<<" "<<Final[mapnum[sta]]<<endl;
}
return 0;
}

/*
for(int i=0; i<count1; i++)
if(Final[i]==0)
ans0++;
else if(Final[i]==1)
ans1++;
cout<<count1<<" "<<ans0<<" "<<ans1<<endl;
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: