```cpp
/*************************************************************************
> File Name: 2741.cpp
> Author: huhao
> Mail: [email protected]
> Created Time: 2017/5/6 13:43:06
************************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-8
#define rt return
#define gc getchar()
#define ll long long
#define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++)
#define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--)
void SWAP(int a,int b)
{
a^=b^=a^=b;
}
int read()
{
int r=1,t=0;
char c=gc;
while(c<'0'||c>'9')
{
if(c=='-')
r=-1;
else
r=1;
c=gc;
}
while(c>='0'&&c<='9')
{
t=(t<<1)+(t<<3)+(c^48);
c=gc;
}
rt r*t;
}
char readchar(int x,int y)
{
char c=gc;
while(c<x||c>y)
c=gc;
rt c;
}
double log(double x,double y)
{
rt log10(x)/log10(y);
}
int gcd(int x,int y)
{
rt y?gcd(y,x%y):x;
}
int lcm(int x,int y)
{
rt x*y/gcd(x,y);
}
int n,m,a[40][40],del[40],p[40],maxx,t[40][10],f[40][40],r[40];
char pr[40];
void print(char *pr)
{
int k=0;
while(pr[k])
k++;
while(k)
putchar(pr[--k]);
}
void dfs(int x)
{
if(x==maxx)
puts(pr);
fr(i,1,maxx)
if(!r[i])
{
int flag=1;
fr(j,1,maxx)
if(i!=j&&f[i][j]&&r[j]==0)
{
flag=0;
break;
}
if(!flag)
continue;
r[i]=1;
pr[x]=i-1+'A';
dfs(x+1);
r[i]=0;
pr[x]=0;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
n=read();
m=read();
fr(i,1,n)
fr(j,1,m)
{
char c=readchar('.','Z');
if(c!='.')
p[a[i][j]=c-'A'+1]=1;
}
fr(i,2,26)
del[i]=del[i-1]+!p[i-1];
fr(i,1,n)
fr(j,1,m)
a[i][j]-=del[a[i][j]];
fr(i,1,n)
fr(j,1,m)
maxx=a[i][j]<maxx?maxx:a[i][j];
fr(i,1,n)
fr(j,1,m)
t[a[i][j]][1]=t[a[i][j]][1]?t[a[i][j]][1]:i;
fd(i,n,1)
fr(j,1,m)
t[a[i][j]][2]=t[a[i][j]][2]?t[a[i][j]][2]:i;
fr(j,1,m)
fr(i,1,n)
t[a[i][j]][3]=t[a[i][j]][3]?t[a[i][j]][3]:j;
fd(j,m,1)
fr(i,1,n)
t[a[i][j]][4]=t[a[i][j]][4]?t[a[i][j]][4]:j;
fr(i,1,maxx)
{
fr(j,t[i][1],t[i][2])
if(a[j][t[i][3]]!=i)
f[a[j][t[i][3]]][i]=1;
fr(j,t[i][1],t[i][2])
if(a[j][t[i][3]]!=i)
f[a[j][t[i][3]]][i]=1;
fr(j,t[i][3],t[i][4])
if(a[t[i][1]][j]!=i)
f[a[t[i][1]][j]][i]=1;
fr(j,t[i][3],t[i][4])
if(a[t[i][2]][j]!=i)
f[a[t[i][2]][j]][i]=1;
}
fr(i,1,maxx)
fr(j,1,maxx)
fr(k,1,maxx)
if(f[i][k]&&f[k][j])
f[i][j]=1;
dfs(0);
rt 0;
}
//重发一遍
```
by huhao @ 2017-05-06 16:33:19