华为OD机试--猜数字 E100

题目描述

一个人设定一组四码的数字作为谜底,另一方猜,

每猜一个数,出数者就要根据这个数字给出提示,提示以XAYBXAYBXAYB形式呈现,直到猜中位置。

其中XXX表示位置正确的数的个数(数字正确且位置正确),而YYY表示数字正确而位置不对的数的个数。

例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B.

例如,当谜底为5637,而猜谜者才4931时,出题者必须提示1A0B.

当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。

输入描述

第一行输入一个正整数,0<N<1000<N < 1000<N<100.

接下来 NNN 行,每一行包含一个猜测的数字与提示结果。

输出描述

输出最后的答案,答案不确定则输出NA。

示例1

输入

6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B

输出

3585

题解

暴力破解,
遍历 1000 ~ 9999
逐个匹配

注: 一个数字猜对后不可再次使用

源码Java

public class GuessNUmber {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		int n = Integer.parseInt(scanner.nextLine());
		List<String[]> guesses = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			String s = scanner.nextLine();
			String[] guess = s.split(" ");
			guesses.add(guess);
		}
		List<Integer> results = new ArrayList<>();
		for (int i = 1000; i < 10000; i++) {
			for (int ii = 0; ii <= guesses.size() ; ii++) {
				if (ii == guesses.size()) {
					// 如果所有猜测都符合则加入结果集合
					results.add(i);
					continue;
				}
				String result = getString(i+"", guesses.get(ii)[0]);
				if (!result.equals(guesses.get(ii)[1])) {
					break;
				}
			}
			// 出现非唯一结果则结束
			if (results.size() > 1) {
				break;
			}
		}
		if (results.size() == 1) {
			System.out.println(results.get(0));
		} else {
			System.out.println("NA");
		}
	}

	// 返回猜测结果
	private static String getString(String tar, String num) {
		int allRight = 0;
		int numRight = 0;
		char[] tars = tar.toCharArray();
		char[] nums = num.toCharArray();
		for (int j = 0; j < nums.length; j++) {
			if (tar.charAt(j) == num.charAt(j)) {
				allRight++;
				// 猜对的数字修改为特殊字符
				tars[j] = '#';
				nums[j] = '_';
			}
		}
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < tars.length; j++) {
				if (tars[j] == nums[i]) {
					numRight++;
					// 猜对的数字修改为特殊字符
					tars[j] = '#';
					nums[j] = '_';
					break;
				}
			}
		}
		String result = allRight + "A" + numRight + "B";
		return result;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚定的小辣鸡在努力

你的支持是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值