【HDU - 1172】猜数字 (枚举暴力)
題干:
猜數(shù)字游戲是gameboy最喜歡的游戲之一。游戲的規(guī)則是這樣的:計(jì)算機(jī)隨機(jī)產(chǎn)生一個(gè)四位數(shù),然后玩家猜這個(gè)四位數(shù)是什么。每猜一個(gè)數(shù),計(jì)算機(jī)都會(huì)告訴玩家猜對(duì)幾個(gè)數(shù)字,其中有幾個(gè)數(shù)字在正確的位置上。?
比如計(jì)算機(jī)隨機(jī)產(chǎn)生的數(shù)字為1122。如果玩家猜1234,因?yàn)?,2這兩個(gè)數(shù)字同時(shí)存在于這兩個(gè)數(shù)中,而且1在這兩個(gè)數(shù)中的位置是相同的,所以計(jì)算機(jī)會(huì)告訴玩家猜對(duì)了2個(gè)數(shù)字,其中一個(gè)在正確的位置。如果玩家猜1111,那么計(jì)算機(jī)會(huì)告訴他猜對(duì)2個(gè)數(shù)字,有2個(gè)在正確的位置。?
現(xiàn)在給你一段gameboy與計(jì)算機(jī)的對(duì)話過程,你的任務(wù)是根據(jù)這段對(duì)話確定這個(gè)四位數(shù)是什么。?
Input
輸入數(shù)據(jù)有多組。每組的第一行為一個(gè)正整數(shù)N(1<=N<=100),表示在這段對(duì)話中共有N次問答。在接下來的N行中,每行三個(gè)整數(shù)A,B,C。gameboy猜這個(gè)四位數(shù)為A,然后計(jì)算機(jī)回答猜對(duì)了B個(gè)數(shù)字,其中C個(gè)在正確的位置上。當(dāng)N=0時(shí),輸入數(shù)據(jù)結(jié)束。?
Output
每組輸入數(shù)據(jù)對(duì)應(yīng)一行輸出。如果根據(jù)這段對(duì)話能確定這個(gè)四位數(shù),則輸出這個(gè)四位數(shù),若不能,則輸出"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 0Sample Output
3585 Not sure?
解題報(bào)告:
? ? ?因?yàn)檫@題元素不多,1000-9999,所以枚舉一下就可以了。然后看跑完一遍以后如果有多個(gè)滿足條件的那就notsure,如果只有一個(gè)滿足條件的那就輸出這一個(gè)。然后還要注意fit函數(shù)中必須用book數(shù)組記錄當(dāng)前位置是否判斷過(在判斷猜對(duì)數(shù)字時(shí)需要用,在判斷猜對(duì)位置時(shí)不需要用),否則 1234 和5116,這種在循環(huán)的時(shí)候也會(huì)被判斷成有兩個(gè)猜對(duì)數(shù)字,但其實(shí)只有一個(gè)猜對(duì)數(shù)字。
AC代碼:
#include<cstring> #include<set> #include<iostream> #include<algorithm> #include<cstdio> #define ll long long using namespace std; int n; int guess[5000],yes[5000],yespos[5000]; set<int >:: iterator it; //比較set中值和guess中i ,看set中的是否滿足這個(gè)gusee如果不滿足那就刪除這個(gè)可能值。 bool fit(int inset,int ii) { // int ge[2],shi[2],bai[2],qian[2];int tmp = guess[ii];int geussi[5] ;int inseti[5] ;int p = 0;while(inset) {inseti[++p] = inset%10;inset/=10;}p = 0;while(tmp) {geussi[++p] = tmp%10;tmp/=10;}int ans = 0;bool bk1[5],bk2[5];memset(bk1,0,sizeof(bk1));memset(bk2,0,sizeof(bk2));for(int i = 1; i<=4; i++) {for(int j = 1; j<=4; j++) {if(geussi[i] == inseti[j] && !bk1[i] && !bk2[j]) {ans++;bk1[i]=1;bk2[j] = 1;}}}if(ans != yes[ii]) return 0 ;ans = 0;for(int i = 1; i<=4; i++) {if(geussi[i] == inseti[i]) ans++;}if(ans != yespos[ii]) return 0 ;return 1; // ge[0] = inset%10;ge[1] = geussi%10; // inset/=10;geussi/=10; // shi[0] = inset%10;shi[1] = geussi%10; // inset/=10;geussi/=10; // bai[0]=inset%10;bai[1] = geussi%10; // inset/=10;geussi/=10; // qian[0]=inset%10;qian[1] = geussi%10; // } int main() {while(scanf("%d",&n)) {if(n == 0 ) break;set<int > st; // for(int i = 1000; i<=9999; i++) st.insert(i);for(int i = 1; i<=n; i++) {scanf("%d%d%d",&guess[i],&yes[i],&yespos[i]);}int ans = 0,res,flag; // while(!st.empty()) { // for(it = st.begin(); it!=st.end(); it++) {for(int q = 1000; q<=9999; q++) {flag = 0;for(int i = 1; i<=n; i++) {if(!fit(q,i)) {flag = 1; break;}}if(flag == 0) {res = q;ans++;}if(ans >=2) break;} if(ans>=2) cout << "Not sure"<<endl;else cout << res<< endl; // } // } // if(st.empty() || st.size() !=1) puts("Not sure"); // else printf("%d\n",*(st.begin()));}return 0 ; }總結(jié):
? ?本來想用set,?然后枚舉過一個(gè)就刪除一個(gè)頂點(diǎn),但是發(fā)現(xiàn)沒必要啊反正整個(gè)循環(huán)你就跑一次(即1000~9999)這些數(shù)字就跑一次,用set有卵用。。。。
總結(jié)
以上是生活随笔為你收集整理的【HDU - 1172】猜数字 (枚举暴力)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年世界经济展望,世界经济或增长
- 下一篇: 【POJ - 2533】Longest