hdu1172猜数字

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1172

题目

猜数字

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2540    Accepted Submission(s): 1475


Problem 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 Input
6 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 Output
3585 Not sure
 

Author
lwg
 

Recommend
We have carefully selected several similar problems for you:  1106 1175 1174 1180 1108
 
这个题目的思路是:

从1000到9999进行暴力枚举。。。

须要满足两个条件:

1:题目所给的条件和眼下枚举的值要有同样的位数的值要相等。。

2:将眼下枚举的数和题目所给的数进行枚举,看所给的条件的数与眼下枚举的的数的出现同样的数相等的数有多少个。。可是反复的书不算。。所以开个标志变量。。。

所以我的暴力枚举解法例如以下:

#include<cstdio>
#include<cstring>
const int maxn=100+10;
struct node
{
    int a,b,c;
}point[maxn];
int a[5],b[5];
int mark[5];
void pre_deal(int c,int d)
{
    a[1]=c/1000;
    a[2]=c/100%10;
    a[3]=c/10%10;
    a[4]=c%10;
    b[1]=d/1000;
    b[2]=d/100%10;
    b[3]=d/10%10;
    b[4]=d%10;
}

int judge(int x,int y)
{
     int count1,count2;
     count1=count2=0;
     memset(a,0,sizeof(a));
     memset(b,0,sizeof(b));
     memset(mark,0,sizeof(mark));
     pre_deal(x,point[y].a);
     for(int i=1;i<=4;i++)
        {
             if(a[i]==b[i])
               count1++;
        }
    // printf("count1:%d
",count1);
     if(count1!=point[y].c)
         return 0;
     for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
       {
          if(a[i]==b[j]&&!mark[j])
          {
             mark[j]=1;
             count2++;
             break;
          }
       }
    //printf("count2:%d
",count2);
    if(count2!=point[y].b)
        return 0;
    else
        return 1;
}

int main()
{
    int n,ok;
    int count,ans;
    while(scanf("%d",&n)!=EOF&&n)
    {
        count=0;
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&point[i].a,&point[i].b,&point[i].c);
        for(int i=1000;i<=9999;i++)
            {
                ok=1;
                for(int j=1;j<=n;j++)
                 {
                     ok=judge(i,j);
                     if(!ok)
                        break;
                 }
                if(ok)
                {
                    count++;
                    ans=i;
                }
                if(count==2)
                  break;
            }
     //   printf("count:%d
",count);
        if(count==1)
            printf("%d
",ans);
        else
            printf("Not sure
");
     }
    return 0;
}

原文地址:https://www.cnblogs.com/mengfanrong/p/3871449.html