四子棋
来源:互联网 发布:周期表中原子半径数据 编辑:程序博客网 时间: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
- 四子棋
- 四子棋游戏--bingo game
- 四子棋剩余的源代码
- POJ1568 四子棋 博弈
- python四子棋游戏
- 有AI的重力四子棋
- [Android]四子棋游戏开发源码和分析
- 【原创】【程序小游戏】平面四子棋 C++
- (原创)儿时四子棋程序(初步版)
- JAVA安卓植物大战僵尸主题四子棋游戏
- 北京工业大学 大一C语言课程设计--四子棋(Bingo)(连子游戏)in TurboC 3.0
- html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码
- vc++6.0 下实现的 立体四子棋 程序 (原型来源于北京科技馆)
- Java基本功练习十(多维数组强化二【悬挂的四子棋】)
- html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码
- 人机对战初体验:Python基于Pygame实现四子棋游戏
- appium服务日志解析
- 单选多选
- Spring工作流程
- [阿里Hao]Android无线开发的几种常用技术
- jQuery.validate.js之二【整理】
- 四子棋
- STM32F1系列 调试硬件I2C应注意的问题
- 十款经典php网店系统
- IOS UITableViewCell样式
- [RQNOJ 216][codevs 1041]Car的旅行路线
- NY448寻找最大数
- 大二下半学期以及未来的展望
- 通过使用DOSBOX运行MASM
- 作业——在线学习Android课程之第一周