7-24 猜数字游戏

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:

输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:

在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:

58 4
70
50
56
58
60
-2

输出样例:

Too big
Too small
Too small
Good Guess!

 

#include<stdio.h>

int main()
{
	int rand_num,N;
	scanf("%d %d",&rand_num,&N);
	int num[105] = {0};
	int cnt = 0;
	while( 1 ){
		scanf("%d",&num[cnt]);
		if( num[cnt] < 0 ){
			break;
		}else{
			cnt++;
		}
	}
	for( int i=0; i<=cnt; i++ ){
		if( num[i]<0 && i+1<=N ){
			printf("Game Over\n");
			break;
		}
		
		if( i+1 > N ){
			printf("Game Over\n");
			break;
		}
		
		if( num[i] < rand_num ){
			printf("Too small\n");
		}else
		if( num[i] > rand_num ){
			printf("Too big\n");
		}else{
			if( i+1 == 1){
				printf("Bingo!\n");
			}else
			if( i+1>1 && i+1<=3 ){
				printf("Lucky You!\n");
			}else
			if( i+1>3 && i+1<=N ){
				printf("Good Guess!\n");
			}
			break;
		}
	}
	
	return 0;
}

 

### 7-24 猜数字 编程实现与算法思路 #### 问题描述 猜数字游戏的目标是从一组提示中推断出一个四位数的秘密数字。每猜测会返回两个反馈值: 1. **A**:表示猜对的数字且位置正确的个数。 2. **B**:表示猜对的数字但位置不正确的个数。 目标是根据若干猜测及其对应的反馈,反推出秘密数字。 --- #### 解决思路 1. **输入解析**:接收多猜测以及其对应的结果(即A和B的值)。 2. **验证逻辑**: - 对于每一猜测,逐位对比该猜测与候选解之间的匹配情况。 - 计算每一位是否相等以得出“A”的值;再统计剩余未匹配部分是否有重复数字以得出“B”的值。 3. **穷举法**:尝试所有可能的四位数组合作为候选解,并筛选符合条件的那个组合。 4. **输出结果**:找到唯一满足所有条件的秘密数字并输出。 --- #### 实现步骤详解 以下是具体的Python代码实现: ```python def guess_number(): from collections import Counter def check(guess, secret): """检查guess相对于secret的A和B""" A = 0 B = 0 counter_secret = Counter(secret) counter_guess = Counter(guess) # 首先计算A for i in range(4): if guess[i] == secret[i]: A += 1 # 接着计算总的交集减去A得到B intersection = sum((counter_secret & counter_guess).values()) B = intersection - A return A, B # 获取所有的测试数据 test_cases = [ ("1234", (1, 1)), # 示例输入: 猜测为"1234", 返回(1, 1) ("5678", (0, 0)), ("1122", (2, 0)) ] possible_secrets = [''.join(map(str, candidate)) for candidate in product(range(10), repeat=4)] valid_secrets = [] for secret in possible_secrets: all_match = True for guess, result in test_cases: if check(guess, secret) != result: all_match = False break if all_match: valid_secrets.append(secret) if len(valid_secrets) == 1: return valid_secrets[0] elif not valid_secrets: raise ValueError("No solution found.") else: raise ValueError("Multiple solutions exist.") from itertools import product print(guess_number()) # 调用函数获取答案 ``` --- #### 关键点说明 1. **穷举法的应用**:通过迭代所有可能的四位数组合来寻找唯一的解决方案[^1]。 2. **复杂度分析**:虽然穷举法的时间复杂度较高 ($O(10^4 \times m)$),但对于此类规模较小的问题仍然适用[^3]。 3. **边界条件处理**:需要考虑无解或多解的情况,并给出相应的错误提示。 --- #### 示例运行 假设输入如下三猜测及反馈: 1. 猜测:"1234" → 结果:(1, 1) 2. 猜测:"5678" → 结果:(0, 0) 3. 猜测:"1122" → 结果:(2, 0) 程序将输出唯一符合以上条件的秘密数字 `"1134"`。 --- ### 总结 上述方法利用了穷举法结合精确匹配的方式解决了猜数字问题,尽管时间效率并非最优,但在实际应用中小规模问题完全可行。此外,还可以进一步探索其他高效算法如回溯法或动态规划优化求解过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值