先找出每个矩形的边界,再建立拓扑图。
#include <cstdio>
#include <cstring>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
#define pb(a) push_back(a)
vector<int>g[30];
int n,m,total;
char st[100][100];
int in[100];
char ans[100];
struct node
{
int lx,ly,rx,ry;
}rat[100];
void init()
{
total=0;
memset(in,-1,sizeof(in));
for(int i=1;i<=26;i++)
g[i].clear();
for(int i=1;i<=30;i++)
{
rat[i].lx=100;
rat[i].ly=100;
rat[i].rx=0;
rat[i].ry=0;
}
int num;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(st[i][j]!='.')
{
num=st[i][j]-'A'+1;
rat[num].lx=min(rat[num].lx,i);
rat[num].ly=min(rat[num].ly,j);
rat[num].rx=max(rat[num].rx,i);
rat[num].ry=max(rat[num].ry,j);
}
}
}
}
void build()
{
for(int k=1;k<=26;k++)
{
if(rat[k].lx!=100)
{
if(in[k]==-1) in[k]=0;
total++;
for(int i=rat[k].lx;i<=rat[k].rx;i++)
{
for(int j=rat[k].ly;j<=rat[k].ry;j++)
{
if(i>rat[k].lx&&i<rat[k].rx&&j>rat[k].ly&&j<rat[k].ry) continue;//hehe
if(st[i][j]=='.') continue;
int num=1+st[i][j]-'A';
if(num!=k)
{
g[k].pb(num);
if(in[num]==-1) in[num]+=2;
else in[num]++;
}
}
}
}
}
}
void dfs(int num,char *ans)
{
if(num==total)
{
printf("%s\n",ans);
return;
}
for(int i=1;i<=26;i++)
{
if(in[i]==0)
{
in[i]=-1;
for(int j=0;j<g[i].size();j++)
{
in[g[i][j]]--;
}
char c=i+'A'-1;
char tmp=ans[num];
ans[num]=c;
dfs(num+1,ans);
ans[num]=tmp;
in[i]=0;
for(int j=0;j<g[i].size();j++)
{
int v=g[i][j];
in[v]++;
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%s",st[i]+1);
}
init();
build();
memset(ans,NULL,sizeof(ans));
dfs(0,ans);
}
return 0;
}