程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu1172猜數字

hdu1172猜數字

編輯:C++入門知識

 

猜數字

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:將目前枚舉的數和題目所給的數進行枚舉,看所給的條件的數與目前枚舉的的數的出現相同的數相等的數有多少個。。但是重復的書不算。。所以開個標志變量。。。

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

 

/*
這題是暴力枚舉。。。從1000枚舉到10000,
所以縫合條件為:
1:枚舉到的i和給的條件3即正確位置的要吻合.
2:就是要枚舉i和給的條件2是否要吻合,即相同的位數要相同。。。
*/
#include
#include
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;
}
律神他們那麼剪短的代碼 真想知道啊。。orz!!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved