Livestock Lineup 题解

Description
每天,Farmer John 都要给他的 8 头奶牛挤奶。她们的名字分别是 Bessie,Buttercup,Belinda,Beatrice,Bella,Blue,Betsy,和 Sue。
不幸的是,这些奶牛相当难以伺候,她们要求 Farmer John 以一种符合 N 条限制的顺序给她们挤奶(1≤N≤7)。每条限制的形式为“X 必须紧邻着 Y 挤奶”,要求奶牛 X 在挤奶顺序中必须紧接在奶牛 Y 之后,或者紧接在奶牛 Y 之前。

请帮助 Farmer John 求出一种满足所有限制的奶牛挤奶顺序。保证这样的顺序是存在的。如果有多种顺序都满足要求,请输出字典序最小的一种。也就是说,第一头奶牛需要是所有可能排在任意合法奶牛顺序的第一位的奶牛中名字字典序最小的。在所有合法的以这头字典序最小的奶牛为首的奶牛顺序中,第二头奶牛需要是字典序最小的,以此类推。
Input
输入的第一行包含 N。以下 N 行每行包含一句句子,以 “X must be milked beside Y” 的格式描述了一条限制,其中 X 和 Y 为 Farmer John 的某些奶牛的名字(上文列举了八个可能的名字)。
Output
请用 8 行输出一个奶牛的顺序,每行输出一头奶牛的名字,满足所有的限制。如果由多种顺序符合要求,输出字典序最小的奶牛顺序。
Sample Input
3
Buttercup must be milked beside Bella
Blue must be milked beside Bella
Sue must be milked beside Beatrice
Sample Output
Beatrice
Sue
Belinda
Bessie
Betsy
Blue
Bella
Buttercup
Solution
数据很小,直接暴力即可。字符串有点麻烦。
Code

#include
#include
#include
using namespace std;
int n;
string s1,s2,s3,s4,s5,s6,a[9];
int f[9][9],ans[9],c[10];
bool b[9];
int solve(string s) {
	if(s=="Beatrice")return 1;
	if(s=="Belinda")return 2;
	if(s=="Bella")return 3;
	if(s=="Bessie")return 4;
	if(s=="Betsy")return 5;
	if(s=="Blue")return 6;
	if(s=="Buttercup")return 7;
	return 8;
}
void dfs(int now) {
	if(now==9) {
		bool check=0;
		for(int i=1;i<=8;i++)
			if(c[i]<ans[i]||ans[i]==0) {
				check=1;
				break;
			} else if(ans[i]<c[i])break;
		for(int i=1;i<=8;i++)
			for(int j=1;j<=8;j++)
				if(f[c[i]][j]&&c[i-1]!=j&&c[i+1]!=j)check=0;
		if(check)
			for(int i=1;i<=8;i++)
				ans[i]=c[i];
		return;
	}
	for(int i=1;i<=8;i++)
		if(!b[i])c[now]=i,b[i]=1,dfs(now+1),b[i]=0;
}
int main() {
	scanf("%d",&n);
	a[1]="Beatrice";a[2]="Belinda";a[3]="Bella";
	a[4]="Bessie";a[5]="Betsy";a[6]="Blue";a[7]="Buttercup";a[8]="Sue";
	for(int i=1;i<=n;i++) {
		cin>>s1>>s2>>s3>>s4>>s5>>s6;
		int x=solve(s1),y=solve(s6);
		f[x][y]=1;f[y][x]=1;
	}
	dfs(1);
	for(int i=1;i<=8;i++)
		cout<<a[ans[i]]<<endl;
}

你可能感兴趣的:(USACO,暴力)