Poj1568 Find the Winning Move(极大极小搜索)

题目链接:http://poj.org/problem?id=1568

 

题意:给出一个4x4 tic-tac-toe 的棋局的局面,问先手 "x" 是不是能找在接下来的一步中找到一个必胜局面,如果有,按给出的顺序输出第一个落子位置。

 

博弈题,极大极小搜索刚好可以用于此,注意的是要搜索至分出胜负或和局时返回。

 

#include<stdio.h> #include<string.h> #include<time.h> #define INF 0xff typedef struct talP{ int x,y; talP(){} talP(int _x,int _y):x(_x),y(_y){} void Set(int _x,int _y){x=_x,y=_y;} }Point; char board[4][8]; char cmd[2]; int who,nchess; Point ans; int dir[4][2][2]={{{1,0},{-1,0}},{{0,1},{0,-1}},{{1,1},{-1,-1}},{{1,-1},{-1,1}}}; int MINMOVE(Point,int); int MAXMOVE(Point,int); bool GameOver(Point p) { int i,d,c; int x,y; for(d=0;d<2;d++){ c=1; for(i=0;i<2;i++){ for(x=p.x+dir[d][i][0],y=p.y+dir[d][i][1]; x>-1&&x<4&&y>-1&&y<4&&board[x][y]==board[p.x][p.y]; x+=dir[d][i][0],y+=dir[d][i][1])c++; } if(c>=4) return true; } if(p.x==p.y){ c=1; for(i=0;i<2;i++){ for(x=p.x+dir[2][i][0],y=p.y+dir[2][i][1]; x>-1&&x<4&&y>-1&&y<4&&board[x][y]==board[p.x][p.y]; x+=dir[2][i][0],y+=dir[2][i][1])c++; }if(c>=4) return true; } if(p.x+p.y==3){ c=1; for(i=0;i<2;i++){ for(x=p.x+dir[3][i][0],y=p.y+dir[3][i][1]; x>-1&&x<4&&y>-1&&y<4&&board[x][y]==board[p.x][p.y]; x+=dir[3][i][0],y+=dir[3][i][1])c++; }if(c>=4) return true; } return false; } int MINMOVE(Point p,int max) { int i,j,min,tmp; if(GameOver(p)) return INF; if(nchess==16) return 0; min=INF; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(board[i][j]=='.'){ board[i][j]='o';nchess++; tmp=MAXMOVE(Point(i,j),min); board[i][j]='.';nchess--; if(tmp<min) min=tmp; if(min<=max) return min; } } } return min; } int MAXMOVE(Point p,int min) { int i,j,max,tmp; if(GameOver(p)) return -INF; if(nchess==16) return 0; max=-INF; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(board[i][j]=='.'){ board[i][j]='x';nchess++; tmp=MINMOVE(Point(i,j),max); board[i][j]='.';nchess--; if(tmp>max) max=tmp; if(max>=min) return max; } } } return max; } bool BestMove() { int i,j,tmp,max=-INF; who=0; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(board[i][j]=='.'){ board[i][j]='x';nchess++; tmp=MINMOVE(Point(i,j),max); board[i][j]='.';nchess--; if(tmp>=max){ ans.Set(i,j); max=tmp; } if(max==INF) return true; } } } return false; } int main() { int i,j; //freopen("win1.in","r",stdin); //freopen("bcd.out","w",stdout); //int t=clock(); while(scanf("%s",cmd),cmd[0]=='?'){ for(i=0;i<4;i++) scanf("%s",board[i]); nchess=0; for(i=0;i<4;i++){ for(j=0;j<4;j++) nchess+=board[i][j]!='.'; } if(nchess<=4){puts("#####");continue;} printf(BestMove()?"(%d,%d)":"#####",ans.x,ans.y); puts(""); } //printf("Time : %d/n",clock()-t); return 0; }

 

 

你可能感兴趣的:(c,struct,cmd)