首页 > 学院 > 开发设计 > 正文

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

2019-11-08 02:08:08
字体:
来源:转载
供稿:网友

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

解法:已知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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表