1. 程式人生 > >猜數字遊戲的提示(Master-Mind Hints,UVa340)

猜數字遊戲的提示(Master-Mind Hints,UVa340)

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)