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;
}