关于代码的边界问题
查看原帖
关于代码的边界问题
241817
Chancylaser楼主2023/6/26 23:55

如题。为什么我的代码中的 MM 改为21以上就过了,但是我认为开到11就够了,因为每10个长度为一个周期。


#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
typedef long long LL;
const int N=250,M=21;

int na,ma,nb,mb,nx,mx;
char a[N][N],b[N][N],x[N][N];
set<PII> s1, s2;

int main(){
	cin>>na>>ma;
	for(int i=1;i<=na;i++) cin>>(a[i]+1);
	cin>>nb>>mb;
	for(int i=1;i<=nb;i++) cin>>(b[i]+1);
	cin>>nx>>mx;
	for(int i=1;i<=nx;i++) cin>>(x[i]+1);
	
	for(int i=1;i<=nx;i++)
		for(int j=1;j<=mx;j++)
			if(x[i][j]=='#')
				s1.insert({i,j});
	
	for(int i=1;i<=M;i++)
		for(int j=1;j<=M;j++)
			for(int k=1;k<=M;k++)
				for(int l=1;l<=M;l++){
//					cout<<i<<" "<<j<<"   "<<k<<" "<<l<<"\n";
					s2.clear();
					
					for(int x1=1;x1<=M;x1++)
						for(int y1=1;y1<=M;y1++)
							if(a[x1][y1]=='#')
								s2.insert({x1+i-1,y1+j-1});
								
					for(int x1=1;x1<=M;x1++)
						for(int y1=1;y1<=M;y1++)
							if(b[x1][y1]=='#')
								s2.insert({x1+k-1,y1+l-1});							
					if(s1.size()!=s2.size()) continue;
					
					bool ok=1;
					
					auto it=s1.begin(), it2=s2.begin();
					PII lst1=*s1.begin(), lst2=*s2.begin();
					for(;it!=s1.end();it++,it2++){
						PII t1=*it, t2=*it2;
						if(t1.first-lst1.first != t2.first-lst2.first){
							ok=0;
							break;
						}
						if(t1.second-lst1.second != t2.second-lst2.second){
							ok=0;
							break;
						}
					}
					if(ok){
						cout<<"Yes\n";
						return 0;
					}
				}
		
	cout<<"No\n";
	return 0;
}

2023/6/26 23:55
加载中...