HDU1172 猜數字
猜數字Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2313 Accepted Submission(s): 1329
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
本題采用的是暴力搜索法,在1000至9999中尋找滿足已經給出的那些數的情況,看看是不是每一個都符合,如果有這樣的數且在1000到9999中隻有一個,那麼就是這個數,如果有多個,那麼這個數就是不確定的數
#include<stdio.h> #include<string.h> struct node { int number,lock,sum; }per[150]; int Check(int n,int m) { int a[4],b[4],sign[4],i,j,sumn; for(i=0;i<4;i++) sign[i]=0; a[0]=n/1000; a[1]=(n/100)%10; a[2]=(n/10)%10; a[3]=n%10; b[0]=per[m].number/1000; b[1]=(per[m].number/100)%10; b[2]=(per[m].number/10)%10; b[3]=per[m].number%10; sumn=0; for(i=0;i<4;i++)//判斷位置相同數 { if(a[i]==b[i]) sumn++; } if(sumn!=per[m].lock) return 0; sumn=0; for(i=0;i<4;i++)//判斷數字相同數 { for(j=0;j<4;j++) { if(a[i]==b[j]&&sign[j]==0)//Bug:隻能比較一次 {sumn++;sign[j]=1;break;} } } if(sumn!=per[m].sum) return 0; return 1; } int main() { int i,j,n,flag,Sum,num; while(scanf("%d",&n),n!=0) { for(i=0;i<n;i++) scanf("%d%d%d",&per[i].number,&per[i].sum,&per[i].lock); flag=0;Sum=0; for(i=1000;i<=9999;i++) { for(j=0;j<n;j++) { flag=Check(i,j); if(!flag)break; } if(flag==1) {Sum++;num=i;} } if(Sum==1) printf("%d\n",num); else printf("Not sure\n"); memset(per,0,sizeof(per)); } return 0; }
最後更新:2017-04-03 12:54:51