暑假训练第一场C

题目:

小的时候大家一定玩过“井”字棋吧。也就是在九宫格中,只要任意行、列,或者任意连续对角线上面出现三个相同的,就能获胜。现在小明和小花也在玩三子棋,但是他们不是在九宫格里,而是在3×4的格子里面。现在小明先下,但是他知道小花这个人很聪明,他想知道第一步下在哪一个地方最合适,你能帮帮他吗?




Input 第一行输入一个整数T,表示数据组数(1 第二行输入两个整数x,y,表示3×4格子里面的一个坐标(x,y)(1<=x<=3,1<=y<=4); Output 每组数据输出最后小明输赢的结果,如果小明一定能赢,第一行输出“Win”,第二行输出小明所需要花的最少步数;如果小明跟小花只能打成平手,第一行输出“Equal”,第二行输出数字0;如果小明不能赢也不能跟小花打成平手,第一行输出“Lose”,第二行输出小花赢小明所需要花的最少步数。 Sample Input
2
2 1
2 4
Sample Output
Equal
0
Equal
0


思路:

这个题写之前看着也有点蒙,后来自己画了个棋盘之后发现是相互对称的。即(1,1)(4,1)(1,3)(3,1)这样四个位置起手是没区别的。别的位置也是同理。源码中标志(1,1)(1,2) (2,1) (2,2)分别为1 2 3 4。

即大致为

1 3 3 1

2 4 4 2

1 3 3 1


最小步数的算法是我自己画了个棋盘发现存在这样的情况就肯定会胜利,所以对手足够聪明的情况下回尽可能不让形成这种情况,所以在1位置是会花费6步,3或4花费4步,2会平局,所以建议自己动手画一下试试看。

暑假训练第一场C


源码:

#include<iostream>
using namespace std;
int main()
{
    int a[3][4] = {1,3,3,1,2,4,4,2,1,3,3,1};
    int n,x,y;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> x>>y;
        if (a[x-1][y-1] == 2)cout << "Equal" << endl << 0 << endl;
        else if(a[x-1][y-1]==1) cout << "Win" << endl << 6 << endl;
        else cout << "Win" << endl << 4 << endl;
    }
    return 0;
}