標籤:ane sub 數字遊戲 strong otto ret 結束 表示 color
猜數字
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7279 Accepted Submission(s): 4002
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 Input64815 2 15716 1 07842 1 04901 0 08585 3 38555 3 224815 0 02999 3 30
Sample Output3585Not sure
#include<iostream>using namespace std;const int N=101;int n;struct M{int a,b,c;//a,b,c分別是輸入的A,B,C }m[N];int test(int x,int y){int b[4],c[4],j,i,k=0,s=0,f[4]={0,0,0,0};c[0]=x%10;//////類比值c[1]=(x/10)%10;c[2]=(x/100)%10;c[3]=x/1000;b[0]=m[y].a%10;/////輸入值b[1]=(m[y].a/10)%10;b[2]=(m[y].a/100)%10;b[3]=m[y].a/1000;for(i=0;i<4;i++){//如果類比值是結果,那麼類比值和輸入值相等的位置就是輸入正確的位置 if(b[i]==c[i])k++;}if(k!=m[y].c)//如果正確位置的個數C和類比值和輸入值相等位元不一樣,那麼類比值不是正確結果 return 1;for(i=0;i<4;i++)//對B進行判斷,如果正確個數也相同就是正確結果對於每個輸入值的每位只匹配一次 for(j=0;j<4;j++){if(b[i]==c[j]&&f[j]==0){s++;f[j]=1;break;}}if(s==m[y].b) return 0;elsereturn 1;}int main(){int i,j,k,sign,result;while(cin>>n&&n){k=0;for(i=0;i<n;i++)cin>>m[i].a>>m[i].b>>m[i].c;for(i=1000;i<=9999;i++){//因為是4位元 sign=1;//賦初值為1,表示初始值是不存在正確結果 for(j=0;j<n;j++){sign=test(i,j);//類比值只要不符合一個輸入值就不是正確結果,跳出 if(sign) break;}if(!sign){//如果直到測試完所有輸入值類比值都符合要求,那麼它是正確值 k++;result=i;}}if(k==1)//如果跑完1000到9999,只有一個值符合要求,這就是正確值。 cout<<result<<endl;elsecout<<"Not sure"<<endl;}return 0;}
杭電acm 1172(暴力+結構體)