井字棋 ,这个模拟也是醉了
题目大意:
给出一个井字棋棋局,判断他是不是合法的。若合法且出现某人赢是谁赢了,没出现某人赢是下一步该谁下,还是平局。
解题思路:
分类讨论,就是模拟啊 恶心死~~
下面是(又臭又长的)代码:
#include <set> #include <map> #include <queue> #include <math.h> #include <vector> #include <string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <cctype> #include <algorithm> #define eps 1e-10 #define pi acos(-1.0) #define inf 107374182 #define inf64 1152921504606846976 #define lc l,m,tr<<1 #define rc m + 1,r,tr<<1|1 #define zero(a) fabs(a)<eps #define iabs(x) ((x) > 0 ? (x) : -(x)) #define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (min(SIZE,sizeof(A)))) #define clearall(A, X) memset(A, X, sizeof(A)) #define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE)) #define memcopyall(A, X) memcpy(A , X ,sizeof(X)) #define max( x, y ) ( ((x) > (y)) ? (x) : (y) ) #define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) using namespace std; char s[5][5]; char judge() { char ans=0; if(s[0][0]==s[0][1]&&s[0][0]==s[0][2]&&s[0][0]!='.') { if(ans==0||ans==s[0][0]) ans=s[0][0]; else return 1; } if(s[1][0]==s[1][1]&&s[1][0]==s[1][2]&&s[1][0]!='.') { if(ans==0||ans==s[1][0]) ans=s[1][0]; else return 1; } if(s[2][0]==s[2][1]&&s[2][0]==s[2][2]&&s[2][0]!='.') { if(ans==0||ans==s[2][0]) ans=s[2][0]; else return 1; } if(s[0][0]==s[1][0]&&s[0][0]==s[2][0]&&s[0][0]!='.') { if(ans==0||ans==s[0][0]) ans=s[0][0]; else return 1; } if(s[0][1]==s[1][1]&&s[0][1]==s[2][1]&&s[0][1]!='.') { if(ans==0||ans==s[0][1]) ans=s[0][1]; else return 1; } if(s[0][2]==s[1][2]&&s[0][2]==s[2][2]&&s[0][2]!='.') { if(ans==0||ans==s[0][2]) ans=s[0][2]; else return 1; } if(s[0][0]==s[1][1]&&s[0][0]==s[2][2]&&s[0][0]!='.') { if(ans==0||ans==s[0][0]) ans=s[0][0]; else return 1; } if(s[0][2]==s[1][1]&&s[0][2]==s[2][0]&&s[0][2]!='.') { if(ans==0||ans==s[0][2]) ans=s[0][2]; else return 1; } if(ans==0) return '.'; else return ans; } int main() { int cnt1=0,cnt2=0; for(int i=0; i<3; i++) { scanf("%s",s[i]); for(int j=0; j<3; j++) { if(s[i][j]=='X') { cnt1++; } else if(s[i][j]=='0') { cnt2++; } } } if(cnt1-cnt2<0||cnt1-cnt2>1) { puts("illegal"); return 0; } char ans=judge(); if(ans=='X') { if(cnt1>cnt2) puts("the first player won"); else puts("illegal"); return 0; } else if(ans=='0') { if(cnt1==cnt2) puts("the second player won"); else puts("illegal"); return 0; } else if(ans==1) { puts("illegal"); return 0; } if(cnt1+cnt2==9) { puts("draw"); return 0; } else { if(cnt1==cnt2) { puts("first"); return 0; } else { puts("second"); return 0; } } return 0; }