猜數字遊戲的提示(Master-Mind Hints,UVa340)
阿新 • • 發佈:2018-05-27
nbsp 出現的次數 col ++ \n master ast inf src
[本博文非博主原創,思路與題目均摘自 劉汝佳《算法競賽與入門經典(第2版)》]
Question
例題3-4 猜數字遊戲的提示(Master-Mind Hints,UVa340)
實現一個經典的“猜數字”遊戲。給定答案序列和用戶猜的序列,統計有多少數字位置正確(A),有多少數字在兩個序列都出現過但位置不對(B)。
輸入包含多組數據。每組輸入第一行為序列長度 n,第二行是答案序列,接下來若幹行猜測序列。猜測序列全0 時該組數據結束。 n=0時輸入結束。
Example Input
4
1 3 5 5
1 1 2 3
4 3 3 5
6 5 5 1
6 1 3 5
1 3 5 5
0 0 0 0
10
1 2 2 2 4 5 6 6 6 9
1 2 3 4 5 6 7 8 9 1
1 1 2 2 3 3 4 4 5 5
1 2 1 3 1 5 1 6 1 9
1 2 2 5 5 5 6 6 6 7
0 0 0 0 0 0 0 0 0 0
0
Example Output
Game 1:
(1,1)
(2,0)
(1,2)
(1,2)
(4,0)
Game 2:
(2,4)
(3,2)
(5,0)
(7,0)
Code
/* 例3-4 猜數字遊戲的提示(Master-Mind Hints,UVa340) */ #include<iostream> using namespace std; const int maxn = 1010; int main(){ int a[maxn],b[maxn]; int A,B,n,cases = 0; while(scanf("%d", &n) == 1 && n){//n=0,則:結束 printf("Game %d:\n", ++cases); for(int i=0;i<n;i++){ scanf("%d", &a[i]); //輸入答案序列 } while(true){ B = 0; A = 0;//位置一一匹配成功對:A歸零 for(int j=0;j<n;j++){ scanf("%d", &b[j]); if(a[j] == b[j]) A++; } if(b[0] == 0)//默認猜測序列的首元素為0,則為全0,結束猜測 break; int c1,c2; for(int d=1;d<9;d++){//對於1-9,答案序列與猜測序列分別統計對應數字有多少個 c1 = 0; c2 = 0; for(int j=0;j<n;j++){ if(a[j] == d) c1++; if(b[j] == d) c2++; } B += c1<c2?c1:c2;//對同一數字,答案序列的次數與猜測序列出現數字的次數,兩序列中同一數字出現的次數最少值為m,則說明: // 各數字在兩序列中一一對應的對數不超過m,其中m包含了兩部分: // 1.一一對應的對數; 2.位置不匹配的對數 } printf("(%d,%d)\n", A, B - A); } } return 0; } /* 測試數據 4 1 3 5 5 1 1 2 3 4 3 3 5 6 5 5 1 6 1 3 5 1 3 5 5 0 0 0 0 10 1 2 2 2 4 5 6 6 6 9 1 2 3 4 5 6 7 8 9 1 1 1 2 2 3 3 4 4 5 5 1 2 1 3 1 5 1 6 1 9 1 2 2 5 5 5 6 6 6 7 0 0 0 0 0 0 0 0 0 0 0 */
猜數字遊戲的提示(Master-Mind Hints,UVa340)