这个窗口的题,就是统计下行列相同的,可以旋转四次以后会有多少个相同的设计。行列不同的时候就是要上下旋转了检查一下就可以这个题。难度在于模拟,
队友出的这个题,具体的细节可以看代码~~四个旋转和两个旋转直接暴力就行
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <string> using namespace std; const int maxn=200; string mapp[maxn]; struct note { char a[150][150]; int flag; } g[30000]; int n,m; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0; i<n; i++) cin >> mapp[i]; int nn,mm; for(int i=1; i<=n; i++) if(mapp[i][1]=='#') { nn=i; break; } for(int j=1; j<=m; j++) if(mapp[1][j]=='#') { mm=j; break; } int cnt=0; for(int i=0; i<=n-nn; i+=nn) for(int j=0; j<=m-mm; j+=mm) { cnt++; for(int k=1; k<=nn-1; k++) for(int l=1; l<=mm-1; l++) g[cnt].a[k][l]=mapp[i+k][j+l]; } for(int i=1; i<=cnt; i++) g[i].flag=1; int ans=0; if(nn==mm) { for(int i=1; i<=cnt; i++) if(g[i].flag) { ans++; for(int j=1; j<=cnt; j++) if(i!=j) { int flag=0; for(int x=1; x<=nn-1; x++) for(int y=1; y<=mm-1; y++) if(g[i].a[x][y]!=g[j].a[y][mm-x]) flag=1; if(flag==0) { g[j].flag=0; continue; } else flag=0; for(int x=1; x<=nn-1; x++) for(int y=1; y<=mm-1; y++) if(g[i].a[x][y]!=g[j].a[mm-x][mm-y]) flag=1; if(flag==0) { g[j].flag=0; continue; } else flag=0; for(int x=1; x<=nn-1; x++) for(int y=1; y<=mm-1; y++) if(g[i].a[x][y]!=g[j].a[x][y]) flag=1; if(flag==0) { g[j].flag=0; continue; } else flag=0; for(int x=1; x<=nn-1; x++) for(int y=1; y<=mm-1; y++) if(g[i].a[x][y]!=g[j].a[mm-y][x]) flag=1; if(flag==0) { g[j].flag=0; continue; } else flag=0; } } } else { for(int i=1; i<=cnt; i++) if(g[i].flag) { ans++; for(int j=1; j<=cnt; j++) if(i!=j) { int flag=0; for(int x=1; x<=nn-1; x++) for(int y=1; y<=mm-1; y++) if(g[i].a[x][y]!=g[j].a[nn-x][mm-y]) flag=1; if(flag==0) { g[j].flag=0; continue; } else flag=0; for(int x=1; x<=nn-1; x++) for(int y=1; y<=mm-1; y++) if(g[i].a[x][y]!=g[j].a[x][y]) flag=1; if(flag==0) { g[j].flag=0; continue; } else flag=0; } } } printf("%d\n",ans); } return 0; }