猜數字
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2960 Accepted Submission(s): 1728
Problem Description
猜數字遊戲是gameboy最喜歡的遊戲之一。遊戲的規則是這樣的:計算機隨機產生一個四位數,然後玩家猜這個四位數是什麼。每猜一個數,計算機都會告訴玩家猜對幾個數字,其中有幾個數字在正確的位置上。
比如計算機隨機產生的數字爲1122。如果玩家猜1234,因爲1,2這兩個數字同時存在於這兩個數中,而且1在這兩個數中的位置是相同的,所以計算機會告訴玩家猜對了2個數字,其中一個在正確的位置。如果玩家猜1111,那麼計算機會告訴他猜對2個數字,有2個在正確的位置。
現在給你一段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 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
0
Sample Output
3585
Not sure
猜對的數字間是一一對應關係。
#include <stdio.h>
#include <string.h>
struct Node {
char str[5];
int a, b;
} A[102];
bool Judge(int v, int id) {
char buf[4], *str = A[id].str;
int i = 3, a = 0, b = 0, j;
bool vis[4] = {0};
for ( ; i >= 0; --i) {
buf[i] = v % 10 + '0';
v /= 10;
}
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j)
if (str[i] == buf[j] && !vis[j]) {
vis[j] = 1; ++a; break;
}
if (str[i] == buf[i]) ++b;
}
return a == A[id].a && b == A[id].b;
}
int main() {
// freopen("stdin.txt", "r", stdin);
int N, i, j, val, cnt;
while (scanf("%d", &N), N) {
for (i = 0; i < N; ++i) {
scanf("%s%d%d", A[i].str, &A[i].a, &A[i].b);
}
cnt = 0;
for (i = 1000; i < 10000; ++i) {
for (j = 0; j < N; ++j)
if (!Judge(i, j)) break;
if (j == N) {
if (++cnt == 2) break;
val = i;
}
}
if (cnt == 1) printf("%d\n", val);
else printf("Not sure\n");
}
return 0;
}