题意:判断一共有几种不同的窗户,窗口可以旋转,每个窗口的大小都一样
解题思路:本来想用字符串做的,后来有些搞乱了...如果窗口的长宽相等就要判断4种情况,如果长宽不等就判断2种情况即可(因为长宽不等的话转90°和270°长宽一定不一样)。首先找到窗口的长和宽,用vector存储每个窗口左上角的坐标,然后用一个循环把每个窗口存下来,接下来就是判断了,注意旋转的时候不要写乱了(旋转大概都是这个套路,可以记下来),然后用循环判断有多少不同的窗口,把和这个窗口一样的窗口也做上标记,接下来就不用再判断被标记的窗口了,就是存窗口的时候不大好弄...,窗口的个数要开大点,不然就RE了
代码:
#include <iostream> #include <algorithm> #include <cstring> #include <string> #include <cmath> #include <cstdio> #include <vector> using namespace std; const int maxn=111+10; char s[maxn][maxn]; char g[maxn*50][maxn][maxn]; int r,c; int len1,len2; int vis[maxn*50]; vector<pair<int,int> > vec; bool judge(int x,int y) { bool ok=true; for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { if(g[x][i][j]!=g[y][i][j]) { ok=false; break; } } } if(ok)return true; if(len1==len2)//90 { ok=true; for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { if(g[x][i][j]!=g[y][j][len1-1-i]) { ok=false; break; } } } if(ok)return true; } ok=true; for(int i=0; i<len1; i++) //180 { for(int j=0; j<len2; j++) { if(g[x][i][j]!=g[y][len1-1-i][len2-1-j]) { ok=false; break; } } } if(ok)return true; if(len1==len2)//270 { ok=true; for(int i=0; i<len1; i++) { for(int j=0; j<len2; j++) { if(g[x][i][j]!=g[y][len2-1-j][i]) { ok=false; break; } } } if(ok)return true; } return false; } int main() { while(scanf("%d%d",&r,&c)==2) { vec.clear(); memset(s,0,sizeof(s)); for(int i=1; i<=r; i++) { scanf("%s",s[i]+1); } len1=0,len2=0; for(int i=2; i<=r; i++) { if(s[i][2]!='#')len1++;//行 else break; } for(int i=2; i<=c; i++) { if(s[2][i]!='#')len2++;//列 else break; } for(int i=2; i<=r; i+=len1+1) { for(int j=2; j<=c; j+=len2+1) { vec.push_back(pair<int,int>(i,j)); //cout<<i<<" "<<j<<"!!!!!"<<endl; } } int l=vec.size(); for(int i=0; i<l; i++) { for(int j=vec[i].first; j<=vec[i].first+len1-1; j++) { for(int k=vec[i].second; k<=vec[i].second+len2-1; k++) { g[i][j-vec[i].first][k-vec[i].second]=s[j][k]; } } } memset(vis,0,sizeof(vis)); int ans=0; for(int i=0; i<l; i++) { if(!vis[i]) { vis[i]=1; ans++; for(int j=i+1; j<l; j++) { if(judge(i,j))vis[j]=1; } } } printf("%d\n",ans); } return 0; } /* 11 16 ################ #....#++++#+...# #....#++.+#+...# #....#.++.#++.+# #....#....#++++# ################ #....#.+..#++++# #..++#.+..#++.+# #+...#....#.++.# #+...#..++#....# ################ 9 21 ##################### #...+#++++#+...#..+.# #..+.#.++.#.+..#..+.# #.+..#....#..+.#..+.# ##################### #.+..#....#..+.#.+..# #..+.#.++.#.+..#.+..# #...+#++++#+...#.+..# ##################### */