BZOJ 1567: [JSOI2008]Blue Mary的战役地图
Submit: 1009 Solved: 576
[Submit][Status][Discuss]
Description
Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏。她正在设法寻找更多的战役地图以进一步提高自己的水平。 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打法能够通过的战役地图,她只需要玩一张,她就能了解这一类战役的打法,然后她就没有兴趣再玩儿这一类地图了。而网上流传的地图有很多都是属于同一种打法,因此Blue Mary需要你写一个程序,来帮助她判断哪些地图是属于同一类的。 具体来说,Blue Mary已经将战役地图编码为n*n的矩阵,矩阵的每个格子里面是一个32位(有符号)正整数。对于两个矩阵,他们的相似程度定义为他们的最大公共正方形矩阵的边长。两个矩阵的相似程度越大,这两张战役地图就越有可能是属于同一类的。
Input
第一行包含一个正整数n。 以下n行,每行包含n个正整数,表示第一张战役地图的代表矩阵。 再以下n行,每行包含n个正整数,表示第二张战役地图的代表矩阵。
Output
仅包含一行。这一行仅有一个正整数,表示这两个矩阵的相似程度。
Sample Input
3
1 2 3
4 5 6
7 8 9
5 6 7
8 9 1
2 3 4
1 2 3
4 5 6
7 8 9
5 6 7
8 9 1
2 3 4
Sample Output
2
HINT
样例解释:
子矩阵:
5 6
8 9
为两个地图的最大公共矩阵
约定:
n<=50
Source
%%%社会栋
暴力压正解
#include <cstdio> #include <cctype> #include <map> #define N 55 using namespace std; map<int,bool>q,Q; inline void Read(int &x) { register char ch=getchar(); for(x=0;!isdigit(ch);ch=getchar()); for(;isdigit(ch);x=x*10+ch-'0',ch=getchar()); } int A[N][N],B[N][N],n,ans; int Main() { Read(n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) Read(A[i][j]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) Read(B[i][j]); for(int i=n;i>=1;--i) { for(int j=1;j<=n-i+1;++j) for(int k=1;k<=n-i+1;++k) for(int l=1;l<=n-i+1;++l) for(int a=1;a<=n-i+1;++a) { bool flag=true; for(int b=0;b<i;++b) { for(int c=0;c<i;++c) if(A[j+b][k+c]!=B[l+b][a+c]) { flag=false; break; } if(flag==false) break; } if(flag) {printf("%d\n",i);return 0;} } } return 0; fclose(stdin); fclose(stdout); } int sb=Main(); int main(int argc,char *argv[]){;}
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。