P1838 三子棋I
题目描述
小a和uim喜欢互相切磋三子棋。三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了。
由于小a比较愚蠢,uim总是让他先。
我们用9个数字表示棋盘位置:
123 456 789 所有的棋谱都是已经结束的棋局,要么一方获胜,要么平局。
今天,他们下了一下午的棋,小a为了提高技术,录下了很多棋谱。他想知道,一盘棋结束时,到底是谁赢。
输入格式
一行,一串数字,表示落子的地点。小a总是先下
输出格式
一行,如果小a赢,输出“xiaoa wins.”。如果uim赢,输出“uim wins.”。如果平局,输出“drew.”
输入输出样例
输入#1
5237649
输出#1
xiaoa wins.
输入#2
539128647
输出#2
drew.
题解:
首先我们明确一点,
如果没有下满就结束,则意味着最后那个下棋的胜利。
如果下满了,就有两种情况,
第一:最后一棋赢了。
第二:最后没一点用,即平局。
然后就是重头戏如何判断输赢,我不会大佬们的方法,我只好投机取巧。
首先明确一点,赢的可能只有这8种
1 2 3
4 5 6
7 8 9
1 5 9
3 5 7
1 4 7
2 5 8
3 6 9
那么我就设一个book数组,存最后一棋那个人下过的所有棋,然后对比成立则win,一个都不成立则drew.
下面放出代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s; cin >> s;
if (s.size() < 9)
{
if (s.size() % 2 == 1)cout << "xiaoa wins.";
else cout << "uim wins.";
}
else
{
int flag = 0,book[10]={0};
for (int i = 0; i < s.size(); i++)if (i % 2 == 0)book[s[i] - '0'] = 1;
if (book[1] == 1 && book[2] == 1 && book[3] == 1)flag = 1;
if (book[4] == 1 && book[5] == 1 && book[6] == 1)flag = 1;
if (book[7] == 1 && book[8] == 1 && book[9] == 1)flag = 1;
if (book[1] == 1 && book[5] == 1 && book[9] == 1)flag = 1;
if (book[3] == 1 && book[5] == 1 && book[7] == 1)flag = 1;
if (book[1] == 1 && book[4] == 1 && book[7] == 1)flag = 1;
if (book[2] == 1 && book[5] == 1 && book[8] == 1)flag = 1;
if (book[3] == 1 && book[6] == 1 && book[9] == 1)flag = 1;
if (flag)cout << "xiaoa wins.";
else cout << "drew.";
}
return 0;
}