猜数字游戏 (Leetcode 299)[C++实现]

这篇博客介绍了猜数字游戏中如何使用哈希表思想来解决数字比较问题。通过创建两个长度为10的数组作为位图,记录每个数字出现的次数,从而计算出公牛(数字和位置都对)和奶牛(数字对位置不对)的数量。最终将结果转化为字符串返回。这种方法巧妙地处理了重复数字的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目,还是有处理技巧的。 下面就是想 将这种技巧,记录下来。(哈希表的思想) 

一、题目描述

你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:

写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:

猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛),

有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。

给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。

提示的格式为 "xAyB" ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B 表示奶牛。

请注意秘密数字和朋友猜测的数字 都可能含有重复数字

示例如下:

输入: secret = "1123", guess = "0111"

输出: "1A1B"

解释: 数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。

"1123"        "1123"

    |      or        |

"0111"        "0111"

注意,两个不匹配的 1 中,只有一个会算作奶牛(数字猜对位置不对)。通过重新排列非公牛数字,其中仅有一个 1 可以成为公牛数字。

二、解题思路:

本质 就是  string 比较的操作,对比string中的字符的差别。  

1. 首先,对于 对比相同坐标的值的对比,好比较。 因为猜的数字的长度 和 secret的长度是相同的。

2. 然后,就是对于 相同坐标的值 不相等的情况,怎么处理?并且还存在重复数值的情况。

官方答案中,提供了一种解题思路,使用 位图的思想 (位图 及 代码实现_Appleeatingboy的博客-优快云博客,创建两个长度为10 的数组, 通过使用数组下标记录 与 数组下标相同的值 的 分别出现的次数。  然后再取  相同坐标的 出现次数的最小值,就是奶牛的数量。

3. 最后,将 公牛数量 和 奶牛数量 拼接成答案。 

三、代码实现:

class Solution {
public:
    string getHint(string secret, string guess) {
        string result;
        int Bnum = 0,Anum =0;
        vector<int> secret_left(10);
        vector<int> guess_left(10);

        for(int i =0 ; i< secret.size() ;i++)
        {
            if(guess[i] == secret[i])
            {
                Anum++;
            }
            else
            {
                //通过与‘0’作差,求出相应的数值即坐标下标,然后统计出现的次数
                ++secret_left[secret[i]-'0'];
                ++guess_left[guess[i] -'0'];
            }
            
        }

        for(int j = 0; j<10 ;j++)
        {
            Bnum += min(secret_left[j],guess_left[j]);
        }

        result = to_string(Anum) + "A"+ to_string(Bnum)+"B";

        return result;
    }
};

四、总结:

通过 字符与‘0’的差值,获取字符的十进制数值

其实这是一种哈希表的思想, 通过 数组的下标,下标对应的数值 巧妙 存储了数值出现的次数。  

<think>好的,我需要帮助用户找到适合初学者的简单C++游戏项目。首先,我得回顾一下用户的需求:他们想要一些容易上手的小游戏项目,用来练习C++编程。用户可能刚接触C++,所以项目不能太复杂,但又要足够有趣,能激发学习兴趣。 接下来,我应该考虑哪些类型的游戏适合初学者。常见的入门游戏项目包括猜数字、井字棋、贪吃蛇、俄罗斯方块等。这些游戏逻辑相对简单,不需要复杂的图形库,可以用控制台实现,或者简单的图形库如SFML、SDL等。不过对于完全的新手来说,可能先从控制台游戏开始更合适,因为图形库的学习曲线较陡。 然后,我需要确保每个项目的描述清晰,步骤明确,并给出实现的关键点。比如猜数字游戏,核心是随机数生成和循环判断;井字棋需要处理二维数组和玩家输入;贪吃蛇涉及到控制台光标移动和键盘输入监听。对于每个项目,需要指出可能用到的C++特性,比如循环、条件判断、数组、函数等,以及可能需要的外部库,如Windows.h中的Sleep函数,或者conio.h中的键盘输入检测。 另外,用户提到“简单易做”,所以每个项目应该分步骤说明,让用户能够逐步实现。比如贪吃蛇可以分为初始化蛇的位置、处理移动、生成食物、检测碰撞等步骤。同时,需要提醒用户注意常见问题,比如控制台刷新导致的闪烁,或者输入处理的方法。 还要考虑是否需要提供示例代码。用户给的示例中有Python的快速排序代码,但用户现在需要的是C++项目。可能给出每个项目的代码框架或关键代码片段,帮助用户开始。例如,猜数字游戏的主循环结构,井字棋的棋盘打印函数等。不过需要注意代码的简洁性,避免复杂度过高。 然后,我需要参考用户提供的引用内容。引用[1]提到通过解决编码问题和做小项目来练习,引用[2]提到了C++算法库和一些资源列表。因此,在回答中可以推荐用户参考这些资源,比如使用LeetCode练习基础,或者查看提到的C++算法库中的代码示例,但主要聚焦在游戏项目上。 最后,生成相关问题,可能需要围绕如何扩展这些项目、学习更多C++特性、优化代码性能等方面提问,帮助用户进一步深入学习。例如,如何添加图形界面到控制台游戏,或者如何处理更复杂的游戏逻辑。 总结一下,我需要列出几个简单的小游戏项目,每个项目给出简介、关键步骤和实现要点,并确保使用正确的中文表达和LaTeX格式(如果有数学内容的话)。同时,引用用户提供的参考内容,并在最后生成相关问题。</think>### 简单易做的C++游戏项目推荐 以下是适合初学者的C++游戏项目,重点锻炼基础语法、逻辑设计和交互实现能力: --- #### 1. **猜数字游戏** **目标**:玩家猜测计算机随机生成的数字。 **关键实现**: - 使用 `rand()` 生成随机数(需包含 `<cstdlib>` 和 `<ctime>`) - 循环结构判断猜测值与目标值的大小关系 - 提供尝试次数限制或得分机制 **代码片段**: ```cpp #include <iostream> #include <cstdlib> #include <ctime> int main() { srand(time(0)); int target = rand() % 100 + 1; int guess, attempts = 0; do { std::cout << "输入猜测(1-100):"; std::cin >> guess; attempts++; if (guess > target) std::cout << "太大了!\n"; else if (guess < target) std::cout << "太小了!\n"; } while (guess != target); std::cout << "恭喜,用了" << attempts << "次猜中!"; return 0; } ``` --- #### 2. **控制台井字棋(Tic-Tac-Toe)** **目标**:双人轮流在3x3格子中放置符号,先连成线者胜。 **关键实现**: - 用二维数组 `char board[3][3]` 表示棋盘 - 判断胜负的逻辑(横向、纵向、对角线) - 输入坐标校验与错误处理 **实现要点**: ```cpp // 示例:判断胜负函数 bool checkWin(char player) { for (int i=0; i<3; i++) { if (board[i][0]==player && board[i][1]==player && board[i][2]==player) return true; // 行 if (board[0][i]==player && board[1][i]==player && board[2][i]==player) return true; // 列 } // 检查对角线... } ``` --- #### 3. **贪吃蛇(控制台版)** **目标**:控制蛇移动吃食物并增长长度,避免撞墙或自身。 **关键实现**: - 使用 `Windows.h` 中的 `SetConsoleCursorPosition` 控制光标位置[^2] - 通过 `_kbhit()` 和 `_getch()` 监听键盘输入 - 链表或数组存储蛇身坐标 **简化步骤**: 1. 初始化蛇的位置和食物位置 2. 循环更新蛇的移动方向 3. 检测碰撞与得分 --- #### 4. **21点扑克游戏** **目标**:模拟21点规则,玩家与计算机对战。 **关键实现**: - 用随机数模拟发牌(A可计为1或11) - 计算手牌点数的最优策略 - 实现“要牌”或“停牌”的交互逻辑 --- #### 5. **迷宫生成与求解** **目标**:生成随机迷宫并用算法自动寻找出口。 **关键实现**: - 使用递归分割算法或深度优先搜索生成迷宫 - 用广度优先搜索(BFS)寻找最短路径 - 控制台字符图形化显示迷宫(如 `#` 表示墙) --- ### 如何开始? 1. 从**猜数字**或**井字棋**入手,熟悉基础语法 2. 逐步尝试需要动态更新的项目(如贪吃蛇) 3. 参考开源代码学习结构设计(例如GitHub上的 `c-algorithms` 库[^2]) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值