题目链接:https://www.luogu.org/problemnew/show/P2741
1.二维数组的排序:vector套vector(不得不吐糟一下这个有些小坑的输出)
2.直接dfs搞一搞,很多细节啦,比如return的时候如何清空记号。
#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
const int Inf=0x3f3f3f3f;
char a[maxn][maxn],ch[maxn],res[maxn];
int h,w,len,wid,num,tot=0;
map<char,int> m,used;
vector< vector<char> >ans;
void change(char k1,char k2)
{
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
if(a[i][j]==k1) a[i][j]=k2;
}
}
}
void dfs(int step)
{
if(step>num)
{
vector<char> tmp;
for(int i=num;i>=1;i--)
{
tmp.push_back(res[i]);//cout<<res[i]<<" ";
}
ans.push_back(tmp);
}
for(int tt=1;tt<=num;tt++)
{
if(used[ch[tt]]) continue;
char tmp=ch[tt];int maxi=0,maxj=0,mini=Inf,minj=Inf;
// cout<<"tmp="<<tmp<<endl;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
if(a[i][j]==tmp)
{
maxi=max(maxi,i);maxj=max(maxj,j);
mini=min(mini,i);minj=min(minj,j);
}
}
}
int flag=1;
for(int i=mini;i<=maxi;i++)
{
if(!((a[i][maxj]=='.'||a[i][maxj]==tmp||used[a[i][maxj]]==1)&&(a[i][minj]=='.'||a[i][minj]==tmp||used[a[i][minj]]==1)))
{
flag=0;
break;
}
}
for(int j=minj;j<=maxj;j++)
{
if(!((a[maxi][j]=='.'||a[maxi][j]==tmp||used[a[maxi][j]]==1)&&(a[mini][j]=='.'||a[mini][j]==tmp||used[a[mini][j]]==1)))
{
flag=0;
break;
}
}
if(flag==1)
{
res[step]=tmp;
used[tmp]=1;
dfs(step+1);
used[tmp]=0;
}
}
}
int main()
{
scanf("%d%d",&h,&w);m['.']=1;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
cin>>a[i][j];
if(!m[a[i][j]]) {num++;ch[num]=a[i][j];m[a[i][j]]=1;}
}
}
dfs(1);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
{
for(int j=0;j<ans[i].size();j++) cout<<ans[i][j];
cout<<endl;
}
return 0;
}