您的位置:首页 > 其它

AtCoder Regular Contest 069 D - Menagerie 枚举起点 递推

2017-02-20 01:37 495 查看
题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话。大家各自报自己的两边是同类还是不同类,问能否有一种满足每个人发言的方式。

解法:已知i-1和i-2可以推i,所以枚举起点羊羊、羊狼、狼羊、狼狼四种可能,最后拿第0只以及第n-1只动物的发言判断是否合法就行。

代码写得比较暴力。。。

#include <cstdio>
int n;
char s[100001],r[100001];
bool c(char a,char b) {
r[0]=a;r[1]=b;
for (int i=2;i<n;++i)
r[i]=r[i-1]=='S'?s[i-1]=='o'?r[i-2]:r[i-2]=='S'?'W':'S':s[i-1]=='x'?r[i-2]:r[i-2]=='S'?'W':'S';
return !(r[n-1]=='S'&&((s[n-1]=='o'&&r[n-2]!=r[0])||(s[n-1]=='x'&&r[n-2]==r[0])))&&
!(r[0]=='S'&&((s[0]=='o'&&r[1]!=r[n-1])||(s[0]=='x'&&r[1]==r[n-1])))&&
!(r[n-1]=='W'&&((s[n-1]=='x'&&r[n-2]!=r[0])||(s[n-1]=='o'&&r[n-2]==r[0])))&&
!(r[0]=='W'&&((s[0]=='x'&&r[1]!=r[n-1])||(s[0]=='o'&&r[1]==r[n-1])));
}
int main()
{
scanf("%d%s",&n,s);
puts(c('S','W')||c('W','S')||c('W','W')||c('S','S')?r:"-1");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: