第一个做到我心态崩溃的毒瘤题, 记录记录下. 事实上并非那么….

题目描述

小a和uim喜欢互相切磋三子棋。三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了。

虽然小a很努力地记录棋谱,可还是下不过uim。

由于小a比较愚蠢,uim总是让他先。小a下的第一个子一定是在中心。

这回小a希望使用计策。目前棋局刚开始,棋盘上不到3颗棋子,小a想知道,根据目前的局势,他有没有必胜策略(也就是自己以最佳方案下棋,无论对手怎么下,自己必胜)。

输入输出格式

输入格式:

3行,表示棋局,O表示小a,X表示uim,-表示没有落子。保证棋子数<=3

输出格式:

2行,

第一行,如果小a赢,输出“xiaoa will win.”。如果小a必败,输出“uim will win.”。如果不知道,输出“Dont know.”

第二行,输出他们已经下了几个棋子。

输入输出样例

输入样例#1:

【1】
---
-O-
---
【2】
---
-O-
-XO

输出样例#1:

 【1】
Dont know.
1
 【2】
xiaoa will win.
3

From Luogu

这道题目在各种意义上都有点坑, 在好多设定上都可以吐槽. 甚至测试点的数据也很不科学. 因此很多人都说这道题是水题.

解题思路: 很容易看出, 小于3颗棋子的时候都是不知道后面什么情况的, 而在等于3颗的情况下. 当xiaoa连续倾斜的下棋子并且umi的棋子下在2468的位置时, xiaoa是必定会赢的. 这个可以自己继续模拟后续下棋步骤. 除了这个情况外, 都是不知道的 有可能平手 有可能是xiaoa赢 或者 umi赢.  所以说, 这道题不存在umi赢的答案.

这是我的代码:
[cc lang=”c”]
#include
int main()
{
char p[3][3];
int count = 0;
for(int i = 0;i < 3;i ++) { for(int j = 0;j < 3;j ++) { p[i][j] = getchar(); if(p[i][j] != '-') { count ++; } } getchar(); getchar(); // Linux 系统换行符为\n Windows换行符为\r\n 多出了一个字符 } if( (p[0][1] != '-' && p[2][1] != '-') || (p[1][0] != '-' && p[1][2] != '-')) { printf("Dont know.\n%d",count); return 0; } if(p[0][1] == 'X' || p[1][0] == 'X' || p[1][2] == 'X' || p[2][1] == 'X') { printf("xiaoa will win.\n%d",count); } else { printf("Dont know.\n%d",count); } return 0; } [/cc] 但是这么水的题却让我弄了一页wa的原因是因为读入有问题. 因为Luogu的评测机环境是linux, 而测试点的数据应该是从windows上弄出来的. 因为linux和windows两者的换行符有差异, 前者是\n 后者是\r\n. 而当windows的换行符来到了linux的环境下, 就会变成两个字符了. 不巧这道题目我用了字符读入的方法输入(当然也可以用读字符串的方法). 虽然特意考虑了用getchar吃掉多余的换行符, 但还是失手了啊! 居然要写两个getchar才能过. 在这道题之前也有碰到因为环境不同然后被换行符坑了. 例如P1765 下面是我写的两个代码 前者全wa 后者ac了

[cc lang=”c”]
#include
int main()
{
int count = 0;
char s[200];
gets(s);

for(int i = 0;s[i] != ‘\0’;i ++)
{
if(s[i] == ‘ ‘)
{
count += 1;
}
else if(s[i] >= 97 && s[i] <= 99) { count += s[i] - 96; } else if(s[i] >= 100 && s[i] <= 102) { count += s[i] - 99; } else if(s[i] >= 103 && s[i] <= 105) { count += s[i] - 102; } else if(s[i] >= 106 && s[i] <= 108) { count += s[i] - 105; } else if(s[i] >= 109 && s[i] <= 111) { count += s[i] - 108; } else if(s[i] >= 112 && s[i] <= 115) { count += s[i] - 111; } else if(s[i] >= 116 && s[i] <= 118) { count += s[i] - 115; } else { count += s[i] - 118; } } printf("%d",count); return 0; } [/cc]
[cc lang=”c”]
#include
int main()
{
int count = 0;
char s[201];
gets(s);

for(int i = 0;s[i] != ‘\0’;i ++)
{
if(s[i] == ‘ ‘)
{
count += 1;
}
else if(s[i] >= 97 && s[i] <= 99) { count += s[i] - 96; } else if(s[i] >= 100 && s[i] <= 102) { count += s[i] - 99; } else if(s[i] >= 103 && s[i] <= 105) { count += s[i] - 102; } else if(s[i] >= 106 && s[i] <= 108) { count += s[i] - 105; } else if(s[i] >= 109 && s[i] <= 111) { count += s[i] - 108; } else if(s[i] >= 112 && s[i] <= 115) { count += s[i] - 111; } else if(s[i] >= 116 && s[i] <= 118) { count += s[i] - 115; } else if(s[i] >= 119 && s[i] <= 122) { count += s[i] - 118; } } printf("%d",count); return 0; } [/cc]
仅是个人猜测, 也许这题的数据也是windows上弄的, 而linux评测机碰到字符\r也读进数组, 于是第一个代码因为最后的else没有限制条件就自然的boom了.

Categories: OIer

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Related Posts

OIer

并查集学习总结

并查集学习总结 并查集在好早之前就想学了.. 虽然是一种比较简单的数据 Read more…

OIer

归并排序学习总结 & P1309

背景 之所以突然说到归并排序,是因为P1309这道题要用到&#8230 Read more…

OIer

队列和广度优先搜索

队列(queue) 队列是什么 队列是一种特殊的线性表. 是一种先进先 Read more…