题意:2361:判断三子棋状态是否合法,3075:判断三子棋状态是否合法且是最终状态。

题解:别去做3075,那道题题目有误,...XXXOOO明明是不合法的偏偏要说合法,网上AC代码也过不了这样例,实际上这样例第三个'X'走下去的时候就已经结束了!!!!根本不可能有第三个'O',实在想过就扭曲一下题意或者网上贴代码上去吧

= =!这是2361的代码。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int main()
 6 {
 7     int T;
 8     for(scanf("%d",&T);T;T--)
 9     {
10         char s[12];
11         for(int i=0;i<9;i+=3)
12             scanf(" %s",s+i);
13         int c1=0,c2=0;
14         bool flag=true;
15         for(int i=0;i<9;i++)
16             if(s[i]=='X')
17                 c1++;
18             else if(s[i]=='O')
19                 c2++;
20         if(c1-c2>1||c1<c2)
21             flag=false;
22         if(!flag)
23         {
24             puts("no");
25             continue;
26         }
27         for(int i=0;i<9;i+=3)
28             if(s[i]==s[i+1]&&s[i+1]==s[i+2]&&s[i]!='.')
29             {
30                 if(s[i]=='X'&&c1!=c2+1)
31                     flag=false;
32                 else if(s[i]=='O'&&c1!=c2)
33                     flag=false;
34             }
35         for(int i=0;i<3;i++)
36             if(s[i]==s[i+3]&&s[i+3]==s[i+6]&&s[i]!='.')
37             {
38                 if(s[i]=='X'&&c1!=c2+1)
39                     flag=false;
40                 else if(s[i]=='O'&&c1!=c2)
41                     flag=false;
42             }
43         if(s[0]==s[4]&&s[4]==s[8]&&s[0]!='.')
44         {
45 
46             if(s[0]=='X'&&c1!=c2+1)
47                     flag=false;
48             else if(s[0]=='O'&&c1!=c2)
49                     flag=false;
50         }
51         if(s[2]==s[4]&&s[4]==s[6]&&s[0]!='.')
52         {
53             if(s[2]=='X'&&c1!=c2+1)
54                     flag=false;
55             else if(s[2]=='O'&&c1!=c2)
56                     flag=false;
57         }
58         if(flag)
59             puts("yes");
60         else
61             puts("no");
62     }
63     return 0;
64 }