其他分享
首页 > 其他分享> > Blue Mary的战役地图

Blue Mary的战役地图

作者:互联网

Blue Mary的战役地图

题目描述

输入格式

输出格式

样例输入

3
1 2 3
4 5 6
7 8 9
5 6 7
8 9 1
2 3 4

样例输出

2

数据范围与提示

Solve

Code

#include <cstdio>
#define ll long long
using namespace std;
const int N = 105, M = 1157621;//M是105*105*105中最大质数
const int N3 = N*N*N;
int n, a[N][N], b[N][N];
ll s[2][N][N];//存前缀和
struct Node {
    int k, x, y, next;
}h[N3];//链表
int head[N3], tot;
int Ha(int k, int x, int y, int p) {//求Hash值
    x--, y--;
    return (int)(s[p][x+k][y+k] - s[p][x][y+k] - s[p][x+k][y] + s[p][x][y]) % M;//通过前缀和求期间和
}
void Add(int k, int i, int j) {//在Hash表中添加,挺像加边操作
    int ha = Ha(k, i, j, 0);
    h[++tot] = (Node) {k, i, j, head[ha]};
    head[ha] = tot;
}
bool Judge(int n, int k, int x, int y) {//判断是否相同
    if (h[n].k != k) return 0;
    for (int i = 0; i < k; ++i)
        for (int j = 0; j < k; ++j)
            if (a[h[n].x+i][h[n].y+j] != b[x+i][y+j])
                return 0;
    return 1;
}
bool Find(int k, int x, int y) {
    int ha = Ha(k, x, y, 1);
    if (!head[ha]) return 0;
    for (int i = head[ha]; i; i = h[i].next)//遍历这条链
        if (Judge(i, k, x, y)) return 1;
    return 0;
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            scanf("%d", &a[i][j]), 
            s[0][i][j] = s[0][i-1][j] + s[0][i][j-1] - s[0][i-1][j-1] + a[i][j];
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            scanf("%d", &b[i][j]),
            s[1][i][j] = s[1][i-1][j] + s[1][i][j-1] - s[1][i-1][j-1] + b[i][j];
    for (int k = 1; k <= n; ++k)
        for (int i = 1; i + k - 1 <= n; ++i)
            for (int j = 1; j + k - 1 <= n; ++j)
                Add(k, i, j);//将第一个图的所有子矩阵加入
    for (int k = n; k >= 1; --k)//从大到小枚举,找到了直接输出,这个for也可以二分
        for (int i = 1; i + k - 1 <= n; ++i)
            for (int j = 1; j + k - 1 <= n; ++j)
                if (Find(k, i, j)) return printf("%d\n", k), 0;
    puts("0");
    return 0;
}

标签:Blue,head,return,int,地图,矩阵,ha,Mary
来源: https://www.cnblogs.com/Z8875/p/13405596.html