1. 程式人生 > >BZOJ 1567: [JSOI2008]Blue Mary的戰役地圖

BZOJ 1567: [JSOI2008]Blue Mary的戰役地圖

using 通過 scan scrip 自己的 gree tput mst 更多

1567: [JSOI2008]Blue Mary的戰役地圖

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1011 Solved: 578
[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

Sample Output

2

HINT

樣例解釋:

子矩陣:
5 6
8 9
為兩個地圖的最大公共矩陣

約定:
n<=50

題目大意:求兩個矩形的最大公共子正方形的邊長

題解:O(n^7)暴力...從大到小枚舉邊長

代碼:

#include<iostream>
#include
<cstdio> #include<cstring> using namespace std; int n; int a[55][55],b[55][55]; inline int read(){ char ch=getchar();int x=0,f=1; for(;!isdigit(ch);ch=getchar())if(ch==-)f=-1; for(;isdigit(ch);ch=getchar())x=x*10+ch-0; return x*f; } int main(){ scanf("%d",&n);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=read(); for(int i=n;i>=1;i--){ for(int k=1;k<=n-i+1;k++){ for(int p=1;p<=n-i+1;p++){ for(int q=1;q<=n-i+1;q++){ for(int y=1;y<=n-i+1;y++){ bool flag=true; for(int j=0;j<i;j++){ for(int l=0;l<i;l++){ if(a[k+j][p+l]!=b[q+j][y+l]){ flag=false; break; } } if(flag==false)break; } if(flag){ printf("%d\n",i); return 0; } } } } } } return 0; }

BZOJ 1567: [JSOI2008]Blue Mary的戰役地圖