usaco frame up(所有拓扑排序的输出)

先根据图建图再拓扑排序。

/**
ID: jinbo wu
TASK: frameup
LANG:C++
*/ 
#include<bits/stdc++.h>
using namespace std;
map<char,int> x1,x2,y3,y2,vis,v;
char a[35][35];
int b[35][35];
char cnt[30];
int du[35];
bool vd[50];
int n,m,l;
char ans[50]; 
void dfs(int num)
{
	int u;
	if(num==l)
	{
		cout<<ans<<endl;
		return ;
		
	}
	for(int i=0;i<l;i++)
	{
		u=cnt[i];
		if(!vd[u]&&!du[u])
		{
			for(int j=0;j<l;j++)
			if(b[u][cnt[j]])
			du[cnt[j]]--;
			vd[u]=1;
			ans[num]=u+'A';
			dfs(num+1);
			for(int k=0;k<l;k++)
			if(b[u][cnt[k]])
			du[cnt[k]]++;
			vd[u]=0;
		} 
	}
	
}
int main()
{
	freopen("frameup.in","r",stdin);
	freopen("frameup.out","w",stdout); 
	cin>>n>>m;
	char c;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
    {
	    cin>>a[i][j];
	    c=a[i][j];
	    if(c!='.')
	    {
	     if(!x1[c]) x1[c]=i;
	     else x1[c]=max(x1[c],i);
		 if(!x2[c]) x2[c]=i;
		 else x2[c]=min(x2[c],i);
		 if(!y3[c]) y3[c]=j;
		 else y3[c]=max(y3[c],j);
		 if(!y2[c]) y2[c]=j;
		 else y2[c]=min(y2[c],j); 
	    }
	    if(!vis[c]&&c!='.')
	    {
	    	cnt[l++]=c-'A';
	    	vis[c]=1;
	    }
	}
	sort(cnt,cnt+l); 
for(int k=0;k<l;k++)
	{
		c=cnt[k]+'A';
		v.clear();
		int t=cnt[k]; 
		for(int i=y2[c];i<=y3[c];i++)
		{
			char u=a[x2[c]][i];
			int f=x2[c];
			if(u!=c&&!v[u]&&u!='.')
			{
				int d=u-'A';
			    b[t][d]=1;
				du[d]++;
				v[u]=1;
			}
		} 
		for(int i=y2[c];i<=y3[c];i++)
		{
			char u=a[x1[c]][i];
			if(u!=c&&!v[u]&&u!='.')
			{
				int d=u-'A';
			    b[t][d]=1;
				du[d]++;
				v[u]=1;
			}
		}
		for(int i=x2[c]+1;i<x1[c];i++)
		{
			char u=a[i][y3[c]];
			if(u!=c&&!v[u]&&u!='.')
			{
				int d=u-'A';
			    b[t][d]=1;
				du[d]++;
				v[u]=1;
			}
		} 
		for(int i=x2[c]+1;i<x1[c];i++)
		{
			int f=y2[c];
			char u=a[i][y2[c]];
			if(u!=c&&!v[u]&&u!='.')
			{
				int d=u-'A';
			    b[t][d]=1;
				du[d]++;
				v[u]=1;
			}
		} 
	}
  dfs(0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值