用扫描线记录最长线段长度,扫左端时表示有线段,如果num为0就是一个区间的开始,个数++num;扫右端时--num,如果为0,是区间的结束。记录最值。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #define mkp make_pair using namespace std; const double EPS=1e-8; const int SZ=12,INF=0x7FFFFFFF; typedef long long lon; char src[SZ][SZ],dst[SZ][SZ]; void init(char x[SZ][SZ],int n) { for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j)cin>>x[i][j]; } } bool same1(char x[SZ][SZ],char y[SZ][SZ],int n) { for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(y[j][n-i+1]!=x[i][j])return 0; } } return 1; } bool same2(char x[SZ][SZ],char y[SZ][SZ],int n) { for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(y[n-i+1][n-j+1]!=x[i][j])return 0; } } return 1; } bool same3(char x[SZ][SZ],char y[SZ][SZ],int n) { for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(y[n-j+1][i]!=x[i][j])return 0; } } return 1; } void getsvd(char dst[SZ][SZ],char src[SZ][SZ],int n) { //是指针 for(int i=0;i<=n;++i) memset(dst[i],0,sizeof(dst[i])); for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j)dst[i][j]=src[i][j]; } for(int i=1;i<=n;++i) { for(int j=1;j<=n/2;++j) { swap(dst[i][j],dst[i][n-j+1]); } } } bool same4(char x[SZ][SZ],char y[SZ][SZ],int n) { char svd[SZ][SZ]; //cout<<sizeof(svd)<<endl; //memset(svd,0,sizeof(svd)); getsvd(svd,x,n); //return equal(svd+2,svd+3,y+2); //return equal(svd[1]+1,svd[1]+1+n*12,y[1]+1); return equal(svd[1]+1,svd[1]+n*12,y[1]+1); } bool same5(char x[SZ][SZ],char y[SZ][SZ],int n) { char svd[SZ][SZ]; getsvd(svd,x,n); if(same1(svd,y,n))return 1; else if(same2(svd,y,n))return 1; else if(same3(svd,y,n))return 1; else return 0; } bool same6(char x[SZ][SZ],char y[SZ][SZ],int n) { return equal(x[1]+1,x[1]+n*12,y[1]+1); } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { int n; cin>>n; init(src,n),init(dst,n); if(same1(src,dst,n))cout<<1<<endl; else if(same2(src,dst,n))cout<<2<<endl; else if(same3(src,dst,n))cout<<3<<endl; else if(same4(src,dst,n))cout<<4<<endl; else if(same5(src,dst,n))cout<<5<<endl; else if(same6(src,dst,n))cout<<6<<endl; else cout<<7<<endl; } return 0; }