我过了带模拟 我好快乐 我是快乐的小熊软糖
吉首大学新生赛的带模拟 下井字棋问自己两步能不能赢
其实也不算很大233
代码长度3185 生涯之耻(不是
注释应该蛮清楚的(挠头
要注意的一点是如果初始局面自己已经获胜了 这个时候算wrong
#include<bits/stdc++.h> #define pf printf #define sc(x) scanf("%d", &x) #define scs(x) scanf("%s", x) #define scl(x) scanf("%lld", &x) #define mst(a,x) memset(a, x, sizeof(a)) #define rep(i,s,e) for(int i=s; i<e; ++i) #define dep(i,e,s) for(int i=e; i>=s; --i) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 5e5 + 5; char mp[3][3],c,d,t,p; map<char,int>aaa; int judge(char x){ rep(i,0,3) if(mp[i][0]==x&&mp[i][1]==x&&mp[i][2]==x) return 1; rep(i,0,3) if(mp[0][i]==x&&mp[1][i]==x&&mp[2][i]==x) return 1; if(mp[0][0]==x&&mp[1][1]==x&&mp[2][2]==x) return 1; if(mp[0][2]==x&&mp[1][1]==x&&mp[2][0]==x) return 1; return 0; } int count(char x){ rep(i,0,3) if((mp[i][0]==x)+(mp[i][1]==x)+(mp[i][2]==x)>=2 &&(mp[i][0]=='.'||mp[i][1]=='.'||mp[i][2]=='.')) return t=1,p=i,1; rep(i,0,3) if((mp[0][i]==x)+(mp[1][i]==x)+(mp[2][i]==x)>=2 &&(mp[0][i]=='.'||mp[1][i]=='.'||mp[2][i]=='.')) return t=2,p=i,1; if((mp[0][0]==x)+(mp[1][1]==x)+(mp[2][2]==x)>=2 &&(mp[0][0]=='.'||mp[1][1]=='.'||mp[2][2]=='.')) return t=3,1; if((mp[2][0]==x)+(mp[1][1]==x)+(mp[0][2]==x)>=2 &&(mp[2][0]=='.'||mp[1][1]=='.'||mp[0][2]=='.')) return t=4,1; return 0; } int find(char x){ rep(i,0,3) if(mp[i][0]!=x&&mp[i][1]!=x&&mp[i][2]!=x) return t=1,p=i,1; rep(i,0,3) if(mp[0][i]!=x&&mp[1][i]!=x&&mp[2][i]!=x) return t=2,p=i,1; if(mp[0][0]!=x&&mp[1][1]!=x&&mp[2][2]!=x) return t=3,1; if(mp[0][2]!=x&&mp[1][1]!=x&&mp[2][0]!=x) return t=4,1; return 0; } int solve(){ getchar(); aaa.clear(); rep(i,0,3) rep(j,0,3){ mp[i][j]=getchar(); aaa[mp[i][j]]++; getchar(); } c=getchar(); d='o'+'x'-c; if(aaa[c]!=aaa[d]) return puts("wrong!"); if(!aaa['.']||judge(d)||judge(c)) return puts("wrong!"); if(aaa['.']==9||aaa[c]==1) return puts("Cannot win!"); //一种是 自己第一步能赢 if(count(c)) return puts("LeeLdler win!"); //一种是 自己不能一步赢 人机能一步赢 先堵人机 //count d 然后根据t去改mp 改完再去count c if(count(d)){ if(t==1) rep(i,0,3) if(mp[p][i]=='.') mp[p][i]=c; else if(t==2) rep(i,0,3) if(mp[i][p]=='.') mp[p][i]=c; else if(t==3) rep(i,0,3) if(mp[i][i]=='.') mp[i][i]=c; else rep(i,0,3) if(mp[i][2-i]=='.') mp[i][2-i]=c; return puts(count(c)?"LeeLdler win!":"Cannot win!"); } //一种是 自己和人机不能一步赢 下自己的 人机去堵 //这时候你选的应该是一个空列 指一行只有自己和空位 //如果没有空列 肯定赢不了 //一个空列有两种情况 两种都判一下 if(!find(d)) return puts("Cannot win!"); else{ int tp1,tp2; if(t==1){ rep(i,0,3) if(mp[p][i]=='.'){ mp[p][i]=c,tp1=i; break; } rep(i,0,3) if(mp[p][i]=='.'){ mp[p][i]=d,tp2=i; } if(count(c)) return puts("LeeLdler win!"); mp[p][tp1]=d,mp[p][tp2]=c; if(count(c)) return puts("LeeLdler win!"); return puts("Cannot win!"); } else if(t==2){ rep(i,0,3) if(mp[i][p]=='.'){ mp[i][p]=c,tp1=i; break; } rep(i,0,3) if(mp[i][p]=='.'){ mp[i][p]=d,tp2=i; } if(count(c)) return puts("LeeLdler win!"); mp[tp1][p]=d,mp[tp2][p]=c; if(count(c)) return puts("LeeLdler win!"); return puts("Cannot win!"); } else if(t==3){ rep(i,0,3) if(mp[i][i]=='.'){ mp[i][i]=c,tp1=i; break; } rep(i,0,3) if(mp[i][i]=='.'){ mp[i][i]=d,tp2=i; } if(count(c)) return puts("LeeLdler win!"); mp[tp1][tp1]=d,mp[tp2][tp2]=c; if(count(c)) return puts("LeeLdler win!"); return puts("Cannot win!"); } else{ rep(i,0,3) if(mp[i][2-i]=='.'){ mp[i][2-i]=c,tp1=i; break; } rep(i,0,3) if(mp[i][2-i]=='.'){ mp[i][2-i]=d,tp2=i; } if(count(c)) return puts("LeeLdler win!"); mp[tp1][2-tp1]=d,mp[tp2][2-tp2]=c; if(count(c)) return puts("LeeLdler win!"); return puts("Cannot win!"); } } } int main(){ int _; sc(_); while(_--) solve(); }
哈哈我过了!
写模拟能直接a真的好快乐!!