題意:一堆不明身份的動物排成一圈,身份可能是羊或狼,羊一定說實話,狼一定說假話。大家各自報自己的兩邊是同類還是不同類,問能否有一種滿足每個人發言的方式。
解法:已知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;}
新聞熱點
疑難解答