四子棋
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; */
相关文章推荐
- Activity的基础知识1
- 单选多选
- appium服务日志解析
- android studio 报Error:failed to find Build Tools revision 23.0.0 rc2
- nginx
- 在html中实时监测输入框的变化------onChange是做不到的
- c++ 类的继承 小实例
- 关于Ruby的一些知识
- VMware中虚拟机复制的问题
- T4模板之菜菜鸟篇
- jquery.validate.js之一【整理】
- XML之初解 -2
- python-列表推倒式-轻量级循环
- codeforces 631c Report
- Spinner
- React概述
- Qt QProgressBar 重写前的练习,了解Qt 槽函数的线程机制
- Lua 脚本语法说明(转)
- Coursera上machine learning证书
- Linux 环境下 Lua 安装(转)