若干个矩形框架覆盖在一起,给出叠在一起后的俯视图,求框架所有可能的摆放顺序(字典序递增),给出的数据中,保证每个框架的每条边上至少出现一个字符。
由于保证了每个框架每条边上至少有一个标记,那么可以求出每个框架的x,y的最大值和最小值,那么它的位置也就能确定了,之后直接Dfs一遍存下答案,排序输出就行。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <string> using namespace std; typedef long long ll; const int fx[4]={0,1,0,-1}; const int fy[4]={1,0,-1,0}; int idx(char c) { if(c>='A' && c<='Z') return c-'A'; else return c-'a'+26; } bool f[100]; char fdx[100]; int g[100][100]; int n,m,p,q; int b[4][100]; char s[33][33]; int maxn; bool slid(int x1,int y1,int x2,int y2,char c) { for (int i=x1; i<=x2; i++) { if (s[i][y1]!='.' && s[i][y1]!=c) return false; if (s[i][y2]!='.' && s[i][y2]!=c) return false; } for (int j=y1; j<=y2; j++) { if (s[x1][j]!='.' && s[x1][j]!=c) return false; if (s[x2][j]!='.' && s[x2][j]!=c) return false; } return true; } void del(int x1,int y1,int x2,int y2) { for (int i=x1; i<=x2; i++) { s[i][y1]=s[i][y1]='.'; s[i][y2]=s[i][y2]='.'; } for (int j=y1; j<=y2; j++) { s[x1][j]=s[x1][j]='.'; s[x2][j]=s[x2][j]='.'; } } string ss[20000]; vector<char> ans; int cnt; void print() { for (int i=ans.size()-1; i>=0; i--) ss[cnt]+=ans[i]; cnt++; } void dfs(int l) { char ts[33][33]; memcpy(ts,s,sizeof s); for (int i=0; i<52; i++) if (f[i]) { if (slid(b[0][i],b[1][i],b[2][i],b[3][i],fdx[i])) { f[i]=false; del(b[0][i],b[1][i],b[2][i],b[3][i]); ans.push_back(fdx[i]); if (l==maxn) print(); else dfs(l+1); f[i]=true; memcpy(s,ts,sizeof s); ans.pop_back(); } } } int id,cd[100]; int main() { // freopen("in.txt","r",stdin); for (char c='a'; c<='z'; c++) fdx[idx(c)]=c; for (char c='A'; c<='Z'; c++) fdx[idx(c)]=c; while(~scanf("%d",&n)) { for (int i=0; i<20000; i++) ss[i]=""; memset(f,false,sizeof f); memset(b[0],0x3f,sizeof b[0]); memset(b[1],0x3f,sizeof b[1]); memset(b[2],-1,sizeof b[2]); memset(b[3],-1,sizeof b[3]); scanf("%d",&m); for (int i=0; i<n; i++) { scanf("%s",s[i]); } maxn=0; for (int i=0; i<n; i++) for (int j=0; j<m; j++) { int id=idx(s[i][j]); f[id]=true; b[0][id]=min(b[0][id],i); b[1][id]=min(b[1][id],j); b[2][id]=max(b[2][id],i); b[3][id]=max(b[3][id],j); } for (int i=0; i<52; i++) if (f[i]) maxn++; cnt=0; dfs(1); sort(&ss[0],&ss[cnt]); for (int i=0; i<cnt; i++) cout<<ss[i]<<endl; } return 0; }