USACO4.4重疊的圖像

題目鏈接: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; 
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章