HDU 1172 猜数字 深搜

        Description
        猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
       比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
       现在给你一段gameboy与计算机的对话过程,你的任务是根据这段对话确定这个四位数是什么。
       
          
      
        Input
        输入数据有多组。每组的第一行为一个正整数N(1<=N<=100),表示在这段对话中共有N次问答。在接下来的N行中,每行三个整数A,B,C。gameboy猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。当N=0时,输入数据结束。
       
          
      
        Output
        每组输入数据对应一行输出。如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。
       
          
      
        Sample Input6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3

0   

     Sample Output3585

Not sure

 思路:就是把1000到9999都搜一遍,如果标记变量为1就是唯一解,否则不是not sure;

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int n;
struct point {
    int a;
    int b[4];//各个数位的数字
    int sum;
    int tol;
};
point tt[105];
int f[4];
int tag;
int ok;

void dfs(int x){
    if(x>9999){
        return;
    }
    f[0]=x%10;
    f[1]=x/10%10;
    f[2]=x/100%10;
    f[3]=x/1000;
    int hj;
    for(int i=0;i<n;i++){
        hj=0;
        int c[5];
        int aa=0,bb=0;//bb相同的数字并且数位相同,aa是相同的数字
        memset(c,0,sizeof(c));
        for(int j=0;j<4;++j){
            if(tt[i].b[j]==f[j]){
                bb++;
            }
        }
        if(bb!=tt[i].tol){ hj=1; break;}
        for(int j = 0;j < 4;j++){
            for(int k = 0;k < 4;k++){
                if(tt[i].b[k]==f[j]&&c[k]==0){
                    aa++;
                    c[k]=1;
                    break;
                }
            }
        }
        if(aa!=tt[i].sum){ hj=1;break; }
    }
    if(hj){dfs(x+1);}
    else{
        tag++;
        ok=x;
        dfs(x+1);
    }
}

int main(){
    while(scanf("%d",&n)!=EOF&&n){
          for(int i = 0;i < n;i++){
            scanf("%d%d%d",&tt[i].a,&tt[i].sum,&tt[i].tol);
            tt[i].b[0]=tt[i].a%10;
            tt[i].b[1]=tt[i].a/10%10;
            tt[i].b[2]=tt[i].a/100%10;
            tt[i].b[3]=tt[i].a/1000;
          }
          tag=0;
          dfs(1000);
          if(tag!=1){
            printf("Not sure\n");
          }
          else{
            printf("%d\n",ok);
          }
    }
    return 0;
}

思路比较好的是,都搜一遍然后看标记变量。都是同学教的,自己好渣啊。。。。。。。。。。。。

你可能感兴趣的:(HDU 1172 猜数字 深搜)