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

  • 相关阅读:
    bootstrap表格内容垂直居中
    [转]配置mysql允许远程连接的方法
    [转]MySQL服务器上添加一个允许远程访问的用户
    [转]Vs解决方案的目录结构设置和管理
    [转]win7下apache2.4响应很慢解决方法
    [转]js中获取时间的函数集
    [转]php和html混编的三种方式
    删除elasticsearch索引脚本
    socket传数据并记录到文件中
    记一次DDos攻击--2016/12/8
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3871449.html
Copyright © 2020-2023  润新知