题解 P1917 【三子棋Ⅱ】

这题呢,是一道水题,不过为什么没人做???

读入9(3*3)个字符,每个有3种情况:

  • ‘-‘ 表示该位置没有棋子;

  • ‘O’ 表示该位置为小a的棋子;

  • ‘X’ 表示该位置为uim的棋子。

那么,我就在线做,读入,如果这个地方有子,就检查,如果是’X’,就看它所在行、列相差1,小a就赢了。

看这个图:

1
2
3
-K-
KOK
-K-

其中K为行、列相差1的地方,如果这里有子,且总子数<4,小a先下,那么中心是小a(第一个子),4个K中的一个位置为uim的子,那么只要小a下在4脚处,那么他就赢了(自己想想)

所以只要4个K中的任意一个位置有uim的子,uim就输了。

为什么呢?

取一种情况:

1
2
3
- X -
- O -
- - -

会演变为:

1
2
3
- X O
- O -
- - -

uim会这样堵:

1
2
3
- X O
- O -
X - -

这时,小a只需在这里下:

1
2
3
- X O
- O -
X - O

很明显,无论uim怎么下,小a都赢了。

接下来几种情况,就像刚才的旋转,其结果都一样。

所以我的方法是对的。

不然输出不知道。

话说我忍不住要吐槽题目:不知道用英文说应该是”I don’t know”,然而。kkk告诉我们:英语不要主语,don’t的写法是dont??还有说好的小a蠢呢??数据竟没有一个是uim赢。

好了不说废话了,上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
char a;//在线做,数组都不要。
int x,fl;//x为子的个数,fl是一个判断小a有没有赢的变量
inline int ab(int a){return a<0?-a:a;}//手写的绝对值函数
int main(){
for(int i=0;i<3;i++)
for(int j=0;j<3;j++){
cin>>a;
if(a!='-'){
x++;//a!='-'表示这里有子,+1个
if(a=='X'&&ab(i-j)==1)fl=1;//判断,如果i和j相差正好1,小a就赢了,标记一下
}
}
if(fl)cout<<"xiaoa will win.\n";//小a赢
else cout<<"Dont know.\n";//不知道
cout<<x;//输出棋子数
}