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

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

剛開始題目沒理解,卡了好久,後來仔細研究了下,發現題目是這個意思:
如果兩個序列的對應位置數字相等,那麼被稱為強匹配(a1);
如果該數字在兩個序列中都出現過,且位置不同,那麼被稱為弱匹配(a2);
注意,只要該位置數字被用於強匹配或弱匹配的計算,那麼該數字將不再被使用;
舉兩個例子:
答案:1 2 2 2 4 5 6 6 6 9
猜數:1 2 3 4 5 6 7 8 9 1
第一次迴圈用來尋找強匹配的數量,即a1的值。
對兩個陣列進行比較後發現,前兩位一一對應,因此由於這兩位數字被用於參加強匹配的統計,所以在之後的統計中這四個數字不再被使用,因為我們讓這四位數字變為-1。
即第一次迴圈後的情況
變更前 1 2 2 2 4 5 6 6 6 9
變更後 -1 -1 2 2 4 5 6 6 6 9
變更前 1 2 3 4 5 6 7 8 9 1
變更後 -1 -1 3 4 5 6 7 8 9 1
現在來統計若匹配的情況
我的思路是用猜數序列的非負數來匹配答案序列,若匹配到,則a2++,答案序列的該數字變為-1(個人感覺這種方法更好理解,其實是因為菜)
-1 -1 2 2 4 5 6 6 6 9
-1 -1 3 4 5 6 7 8 9 1
第一次用3匹配答案序列,遍歷之後,沒有匹配
//其實前兩次應該用開始的兩個數匹配,只不過已經使用過了,所以continue就可以了
第二次用4匹配答案序列,答案序列有與之匹配的4,因此令答案序列的4變為-1
匹配:
-1 -1 2 2 -1 5 6 6 6 9
-1 -1 3 4 5 6 7 8 9 1
第三次用5匹配
匹配:
-1 -1 2 2 -1 -1 6 6 6 9
-1 -1 3 4 5 6 7 8 9 1
第四次用6匹配
匹配:
-1 -1 2 2 -1 -1 -1 6 6 9
-1 -1 3 4 5 6 7 8 9 1
第五次用7匹配
無匹配:
continue;
第六次用8匹配無匹配;
continue;
以此類推,直到最後一次
用1匹配,因為答案序列的1已經因為有與之對應的強匹配而使用過,所以1無匹配,至此,序列遍歷完成;
因為序列中不可能有0,所以只要猜數序列第一位檢測到0就可以退出
下面附上AC程式碼

#include <cstdio>
int main()
{
	int n, i, j, answer[1000], guess[1000], k = 0;
	while (scanf("%d", &n) == 1 && n)
	{
		for (i = 0; i < n; i++)
			scanf("%d", &answer[i]);
		printf("Game %d:\n", ++k);
		while (1)
		{
			int  a1 = 0, a2 = 0, temp[1000] = { 0 };
			for (i = 0; i < n; i++
) temp[i] = answer[i]; for (i = 0; i < n; i++) scanf("%d", &guess[i]); if (guess[0] == 0) break; for (i = 0; i < n; i++) if (temp[i] == guess[i]) { a1++; temp[i] = -1; guess[i] = -1; } for (i = 0; i < n; i++) { if (guess[i] == -1) continue
; for (j = 0; j < n; j++) { if (temp[j] == -1) continue; if (guess[i] == temp[j] && temp[j] >= 0) { a2++; temp[j] = -1; break; } } } printf(" (%d,%d)\n", a1, a2); } } return 0; }