http://poj.org/problem?id=3087
(1)老实说,这是一道十分基本的dfs,但是写题时花的时间还是挺长的。
1)第一次输入没弄好,少了一个%s,且将字符串转化为一串整数(事实上没有这个必要),而且转化时还错误地默认时两色的。。
2)对于无解的处理,一开始是认定,无解时存在周期,而且第一次的洗牌结果会再次出现。前者是对的,但后者是错的(事实上也没有证明过)。
后来用一个计数变量控制深搜的次数在100000次以内,超过次数的默认无解,搞定了(本想WA的说,看来此种思想还是可行的)。
具体代码:
View Code
#include<stdio.h> #include<math.h> #include<string.h> #include<queue> using namespace std; int n, ans; int count; char a[120], b[120], c[220], d[220]; int yes() { int i, g=1; for(i=0;i<2*n;i++) if(c[i]!=d[i]) break; if(i>=2*n) return 1; return 0; } int dfs(int x) { int i, j, k; count++; if(count>=100000) ans=-1; if(ans) return 0; for(i=0;i<n;i++) { d[2*i]=b[i]; d[2*i+1]=a[i]; } for(i=0;i<n;i++) a[i]=d[i]; for(i=0;i<n;i++) b[i]=d[i+n]; k=yes(); if(k) {ans=x; return 0;} dfs(x+1); return 0; } int main() { int i, j, t; while(scanf("%d", &t)!=EOF) { for(i=1;i<=t;i++) { scanf("%d%s%s%s", &n, a, b, c); ans=0; count=0; dfs(1); printf("%d %d\n", i, ans); } } return 0; }
