四子棋

来源:互联网 发布:周期表中原子半径数据 编辑:程序博客网 时间:2024/05/22 14:55
#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;//180410int 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;    */


0 0
原创粉丝点击