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 比較水的一道題目,直接用暴力法就可以解答出來!盡管如此,還是花了我幾個小時寫代碼,糾錯,唉,罪過啊!看來水平還是太差!不過也不是太差,畢竟代碼以及思想是自己鼓搗出來的!下面發代碼! [cpp] #include<iostream> #include<cstring> using namespace std; struct Num { char key[5]; int x,y; }arr[105]; bool Compare(char *str,int num) { int i,j,k,l; int p,q; int flag[5]; //cout<<str<<endl; for(i=0;i<num;i++) { //cout<<i<<endl<<endl; p=0;q=0; memset(flag,0,sizeof(flag)); for(j=0;j<4;j++) { for(k=0;k<4;k++) { if(!flag[k] && str[j]==arr[i].key[k]) {//這裡有一個小知識點,我記錄一下,免得以後忘記! //關於指針,上面把地址傳遞給str,後面就可以直接用str[i]了! p++; flag[k]=1; break; }//這裡統計有一點錯誤! } if(arr[i].key[j]==str[j]) q++; } if(p!=arr[i].x || q!=arr[i].y) return false; } return true; } int main() { int num,count,sum; char str[4]; while(cin>>num && num!=0) { count=0; for(int i=0;i<num;i++) { cin>>arr[i].key>>arr[i].x>>arr[i].y; } for(int i=1000;i<=9999;i++) { itoa(i,str,10); if(Compare(str,num)) { count++; sum=i; } } if(count==1) cout<<sum<<endl; else cout<<"Not sure"<<endl; } return 0; }