拓扑排序题
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char pic[30][30];
int in[26];
bool map[30][30];
struct
{
int ax,ay,bx,by;
}frame[26];
int FrameCnt;
bool choosed[26];
char ans[26];
void TopSort(int k)
{
if(k==FrameCnt)
{
for(int i=0;i<FrameCnt;i++)
cout<<char(ans[i]+'A');
cout<<endl;
return;
}
for(int i=0;i<FrameCnt;i++)
{
if(in[i]==0&&choosed[i]==false)
{
ans[k]=i;
for(int j=0;j<FrameCnt;j++)
if(map[i][j])
in[j]--;
choosed[i]=true;
TopSort(k+1);
choosed[i]=false;
for(int j=0;j<FrameCnt;j++)
if(map[i][j])
in[j]++;
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(in,0,sizeof(in));
memset(pic,false,sizeof(pic));
memset(map,false,sizeof(map));
memset(choosed,false,sizeof(choosed));
bool appear[26]={false};
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>pic[i][j];
if(pic[i][j]=='.')
pic[i][j]=-1;
else
{
pic[i][j]-='A';
appear[pic[i][j]]=true;
}
}
FrameCnt=0;
for(int i=0;i<26;i++)
FrameCnt+=appear[i];
for(int k=0;k<FrameCnt;k++)
{
bool x;
x=false;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(pic[i][j]==k)
{
frame[k].ax=i;
x=true;
break;
}
}
if(x)
break;
}
x=false;
for(int j=0;j<m;j++)
{
for(int i=0;i<n;i++)
{
if(pic[i][j]==k)
{
frame[k].ay=j;
x=true;
break;
}
}
if(x)
break;
}
x=false;
for(int i=n-1;i>=0;i--)
{
for(int j=m-1;j>=0;j--)
{
if(pic[i][j]==k)
{
frame[k].bx=i;
x=true;
break;
}
}
if(x)
break;
}
x=false;
for(int j=m-1;j>=0;j--)
{
for(int i=n-1;i>=0;i--)
{
if(pic[i][j]==k)
{
frame[k].by=j;
x=true;
break;
}
}
if(x)
break;
}
}
for(int k=0;k<FrameCnt;k++)
{
int i,j;
i=frame[k].ax;
for(j=frame[k].ay;j<=frame[k].by;j++)
{
if(pic[i][j]!=k)
map[k][pic[i][j]]=true;
}
i=frame[k].bx;
for(j=frame[k].ay;j<=frame[k].by;j++)
{
if(pic[i][j]!=k)
{
map[k][pic[i][j]]=true;
}
}
j=frame[k].ay;
for(i=frame[k].ax;i<=frame[k].bx;i++)
{
if(pic[i][j]!=k)
{
map[k][pic[i][j]]=true;
}
}
j=frame[k].by;
for(i=frame[k].ax;i<=frame[k].bx;i++)
{
if(pic[i][j]!=k)
{
map[k][pic[i][j]]=true;
}
}
}
for(int i=0;i<FrameCnt;i++)
for(int j=0;j<FrameCnt;j++)
if(map[i][j])
in[j]++;
TopSort(0);
}
return 0;
}