洛谷 P4398 战役地图

枚举

\(O(n^7)\)

非哈希做法

题目数据\(50\),可以暴力枚举每一个位置某种边长的情况是否成立;

边长\(len\)从大到小遍历,一旦找到直接退出。

由于最坏情况\(n^7\)会超时,则通过“剪枝”将匹配的过程缩减;

最终的时间复杂度约为\(n^5\)

AC code

#include <iostream>
using namespace std;
const int N=55;

int a[N][N],b[N][N];

int main()
{
	//freopen("Input.txt","r",stdin);
	//freopen("Output.txt","w",stdout);
	
	int n; cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>a[i][j];
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>b[i][j];
		
	int len=n;
	for(int len=n;len;len--)
		for(int i=0;i<=n-len;i++)
			for(int j=0;j<=n-len;j++)
			{
				for(int sx=0;sx<n;sx++)
					for(int sy=0;sy<n;sy++)
					{
						bool is_success=true;
						for(int x=0;x<len;x++)
							for(int y=0;y<len;y++)
								if(a[i+x][j+y]!=b[sx+x][sy+y])
								{
									is_success=false;
									goto here;
								}
						
						here:
						if(is_success)
						{
							cout<<len<<endl;
							return 0;
						}
					}
			}
	
	cout<<len<<endl;
	
	return 0;
}
posted @ 2022-10-06 09:54  Sankano  阅读(31)  评论(0编辑  收藏  举报