[HDOJ] 1172.猜数字

it2025-11-08  9

Problem Description

猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每 猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。比如计算机随机产生的数字为1122。如果玩家猜 其中一个在正确的位置。如果玩家猜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

思路: 正面求解过于繁琐.. 想到4位数只有不到10^4个数字,对话数最大只有100,即采用枚举。对每个4位数进行N次判断。如果有且仅有一个数,符合每一个对话,这个数即有可能是求解数。

#include <algorithm> #include <cstdio> #include <cstring> #include <iostream> #include <string> #include <vector> using namespace std; int n; int num[101], b[101], c[101]; bool check(int j, int i) { int s[4], t[4], tnum = num[i], tb = b[i], tc = c[i]; for (int k = 3; k >= 0; --k) { s[k] = j % 10; j /= 10; t[k] = tnum % 10; tnum /= 10; } int corPos = 0, corNum = 0; for (int k = 0; k < 4; ++k) if (s[k] == t[k]) ++corPos; for (int k = 0; k < 4; ++k) for (int l = 0; l < 4; ++l) if (s[k] == t[l]) { ++corNum; t[l] = -1; break; } return corNum == tb && corPos == tc; } int main() { while (cin >> n, n) { int i, j, target, count = 0; for (i = 0; i < n; ++i) { cin >> num[i] >> b[i] >> c[i]; } for (j = 3584; j < 3586 && count < 2; ++j) { for (i = 0; i < n; ++i) if (!check(j, i)) break; if (i == n) ++count; target = j; } if (count != 1) cout << "Not sure" << endl; else cout << target << endl; } system("pause"); return 0; }

转载于:https://www.cnblogs.com/ruoh3kou/p/9893459.html

相关资源:用c语言实现设计一个猜数字的游戏,由计算机随机产生一个1-200之间的数,游戏开始后你从键盘输入一个1-300之间的数,如果你猜中了计算机会告诉你猜中了,给出对你的评论,并告诉你你所用的时间。如果你没有猜中则会提示你,你输入的数是大了还是小了,直到你猜中为止。
最新回复(0)