Description
给出一个n*m的矩阵表示若干被相框框起来的同等规模的照片,#表示相框,两张照片被认为是相同的当且仅当其中一张照片经过旋转和另一张照片完全相同,问这个图中有多少张不同的照片
Input
第一行两个整数n和m表示矩阵的行列数,之后一个n*m的矩阵(3<=n,m<=111)
Output
输出不同照片的数量
Sample Input
Sample Output
4
Solution
用一个string里去表示一张照片(一行行放),对于正方形照片有四种情况,长方形照片有两种情况,用每种情况中字典序最小的一个string来表示一张照片,这样就解决了两张照片旋转后相同的情况,把表示所有照片的string扔到map(或set)里统计下数量即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 111
int n,m,vis[maxn][maxn];
char s[maxn][maxn],c[11111];
string ss[5],cc;
map<string,int>M;
int main()
{
while(~scanf("%d%d",&n,&m))
{
M.clear();
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(s[i][j]!='#'&&!vis[i][j])
{
int ii=i,jj=j,cnt=0;
while(s[ii][j]!='#')ii++;ii--;
while(s[i][jj]!='#')jj++;jj--;
int res=0;
for(int x=i;x<=ii;x++)
for(int y=j;y<=jj;y++)
vis[x][y]=1,c[res++]=s[x][y];
c[res]=0;
ss[cnt++]=c;
res=0;
for(int x=ii;x>=i;x--)
for(int y=jj;y>=j;y--)
c[res++]=s[x][y];
c[res]=0;
ss[cnt++]=c;
if(ii-i==jj-j)
{
res=0;
for(int y=jj;y>=j;y--)
for(int x=i;x<=ii;x++)
c[res++]=s[x][y];
c[res]=0;
ss[cnt++]=c;
res=0;
for(int y=j;y<=jj;y++)
for(int x=ii;x>=i;x--)
c[res++]=s[x][y];
c[res]=0;
ss[cnt++]=c;
}
sort(ss,ss+cnt);
cc=ss[0];
for(int k=1;k<cnt;k++)cc=cc+ss[k];
M[cc]=1;
}
printf("%d\n",M.size());
}
return 0;
}