一道快乐的井字棋带模拟

我过了带模拟 我好快乐 我是快乐的小熊软糖

题目链接
吉首大学新生赛的带模拟 下井字棋问自己两步能不能赢
其实也不算很大233
代码长度3185 生涯之耻(不是
注释应该蛮清楚的(挠头
要注意的一点是如果初始局面自己已经获胜了 这个时候算wrong

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#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真的好快乐!!