HDU 1172 猜数字

很久以前做过了,当时以为是搜索,不大会做。后来还是看别人的方法,觉得不是简洁。

今天再做一次,1Y了。水题一道,但有很多技巧

1.如果有多个答案,那就不是正确的解

2.正确的对位数是很容易求的,难的是才对的那个要仔细写。

3.代码的方法直接纯暴力了。

#include <stdio.h>
#include <string.h> 
#define maxn 120

int n;
int gus[maxn] , pos[maxn] , rig[maxn];

int test_pos(int a,int b){
    int cnt = 0;
    while(a > 0){
        if(a%10 == b%10) cnt++;
        a/=10;b/=10;
    }
    return cnt;
}
int vis1[10],vis2[10];
int test_rig(int a,int b){
    int _b=b;
    int cnt = 0;
    memset(vis1,0,sizeof(vis1));
    memset(vis2,0,sizeof(vis2));
    while(a > 0){
         vis1[a%10]++;
        a/=10;
    }
    while(b > 0){
        int t = b%10;
        vis2[b%10]++;
        b /= 10;
    }
    for(int i=0;i<10;i++) {
        if(vis1[i] > 0 && vis2[i] > 0){
            int tx = vis1[i]<vis2[i]?vis1[i]:vis2[i];
            cnt += tx;
        }
    }
    return cnt;
}

bool test(int num)
{
    for(int i=1;i<=n;i++)
    {
        int k1,k2;
        int ok1=(rig[i] == (k1=test_rig(gus[i],num)));
        int ok2=(pos[i] == (k2=test_pos(gus[i],num)));
        if(!ok1 || !ok2) return false;
    }
    return true;
}

int vio()
{
    int ok=0 ,cnt=0;
    for(int i=1000;i<=9999;i++)
    {
        if(test(i)){
            if(cnt == 0) ok=i;
            cnt++;
        }
    }
    if(cnt > 1 || cnt == 0) return 0;
    return ok;
}

int main()
{
    while(scanf("%d",&n),n)
    {
        int t;
        for(int i=1;i<=n;i++) 
            scanf("%d %d %d",&gus[i],&rig[i],&pos[i]);
        if((t=vio()) > 0)
            printf("%d
",t);
        else printf("Not sure
");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/cton/p/3440114.html