这个窗口的题,就是统计下行列相同的,可以旋转四次以后会有多少个相同的设计。行列不同的时候就是要上下旋转了检查一下就可以这个题。难度在于模拟,
队友出的这个题,具体的细节可以看代码~~四个旋转和两个旋转直接暴力就行
#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;
}