五连珠

题目链接:nowcoder 219034

到主站看:https://blog.csdn.net/weixin_43346722/article/details/116173020

题目大意

有两个里面放着着 1~25 各一个的 5*5 矩阵。
然后给你一个 1~25 的排列,你按顺序在两个矩阵中分别划掉这个数。
当一个矩阵满足一行或一列或对角线上的数都被划掉的时候就停止。
问你结束是因为哪个矩阵,如果两个矩阵同时满足,就输出 0。

思路

我们就直接暴力模拟。

具体就是记录每个数字在第一个第二个矩阵中的坐标。
然后划掉就是分别在两个矩阵中划掉。

具体讲一下怎么划掉,这里只讲一个矩阵,另一个也是同样的道理。
把它所在的行和列被划掉的个数加一。
然后再看它是不是在对角线上,这里给出判断方法:
如果是左上右下的对角线,你会发现它 x 坐标与 y 坐标相同。
如果是右上左下的对角线,你会发现它 x 坐标加 y 坐标等于 6。

然后你就判断,给满足的对角线的划掉个数加一。

接着就是看如何判断是否满足条件。
你就直接看有关它的这一行,这一列被划掉的个数是不是 5,两条对角线被划掉的个数是不是 5。
一旦有其中一个满足,就可以了。

然后你把两个矩形都判断一下,如果两个都满足就输出 0,第一个满足就输出 1,第二个满足就输出 2。
这样就可以了。

代码

#include<cstdio>
#include<cstring>

using namespace std;

int T, a1[11], a2[11], b1[11], b2[11], c1[2], c2[2];
int ax[51], ay[51], bx[51], by[51], x, shun[51];

int main() {
    scanf("%d", &T);
    while (T--) {
        memset(a1, 0, sizeof(a1));//初始化
        memset(a2, 0, sizeof(a2));
        memset(b1, 0, sizeof(b1));
        memset(b2, 0, sizeof(b2));
        memset(c1, 0, sizeof(c1));
        memset(c2, 0, sizeof(c2));

        for (int i = 1; i <= 5; i++)
            for (int j = 1; j <= 5; j++) {
                scanf("%d", &x);
                ax[x] = i;//记录每个数字在第一个矩阵中的坐标
                ay[x] = j;
            }
        for (int i = 1; i <= 5; i++)
            for (int j = 1; j <= 5; j++) {
                scanf("%d", &x);
                bx[x] = i;//记录每个数字在第二个矩阵中的坐标
                by[x] = j;
            }

        for (int i = 1; i <= 25; i++) {
            scanf("%d", &shun[i]);
        }
        for (int i = 1; i <= 25; i++) {//按顺序划掉
            a1[ax[shun[i]]]++;//更新那一行,那一列被划掉的数多了一个
            a2[bx[shun[i]]]++;
            b1[ay[shun[i]]]++;
            b2[by[shun[i]]]++;
            if (ax[shun[i]] == ay[shun[i]]) c1[0]++;//在左上右下的对角线上
            if (bx[shun[i]] == by[shun[i]]) c2[0]++;
            if (ax[shun[i]] + ay[shun[i]] == 6) c1[1]++;//在右上左下的对角线上
            if (bx[shun[i]] + by[shun[i]] == 6) c2[1]++;
            if (a1[ax[shun[i]]] == 5 || b1[ay[shun[i]]] == 5 || c1[0] == 5 || c1[1] == 5) {//第一个矩阵满足了
                if (a2[bx[shun[i]]] == 5 || b2[by[shun[i]]] == 5 || c2[0] == 5 || c2[1] == 5) {//第二个矩阵也满足了
                    printf("0\n");//两个同时满足输出 0
                    break;
                }
                printf("1\n");//只有第一个满足输出 1
                break;
            }
            else if (a2[bx[shun[i]]] == 5 || b2[by[shun[i]]] == 5 || c2[0] == 5 || c2[1] == 5) {//第一个每满足,第二个满足了
                printf("2\n");//输出 2
                break;
            }
        }
    }

    return 0;
}