BZOJ 1567 [JSOI2008]Blue Mary的战役地图【二分答案】

直接二分答案暴力枚举。

看到其他题解说需要用哈希存一下矩阵但是实际上没有必要。

尽管暴力枚举的时间复杂度十分高但是实际上我们在验证的时候会减掉许多不存在的情况:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define db double
#define sg string
#define ll long long
#define rel(i,x,y) for(ll i=(x);i<(y);i++)
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define red(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;

const ll N=1e2+5;
const ll Inf=1e18;

ll n,a[N][N],b[N][N];

inline ll read() {
    ll x=0;char ch=getchar();bool f=0;
    while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return f?-x:x;
}

bool check(ll len) {
	rep(x1,1,n+1-len) rep(y1,1,n+1-len) {
		rep(x2,1,n+1-len) rep(y2,1,n+1-len) {
			ll flag=1;
			rel(i,0,len) {
				rel(j,0,len) {
					if(a[x1+i][y1+j]!=b[x2+i][y2+j]) {
						flag=0;break;
					}
				}
				if(!flag) break;
			}
			if(flag) return true;
		}
	}
	return false;
}

int main() {
	n=read();
	
	rep(i,1,n) rep(j,1,n) a[i][j]=read();
	
	rep(i,1,n) rep(j,1,n) b[i][j]=read();
	
	ll ans=0,l=1,r=n;
	
	while(l<=r) {
		ll mid=l+r>>1;
		if(check(mid)) ans=mid,l=mid+1;
		else r=mid-1;
	}
	
	printf("%lld\n",ans);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/83176355