【蓝桥杯C/C++】翻转游戏:多种实现与解法解析

文章目录
- 💯题目
- 💯问题分析
- 解法一:减法法
- 解法二:位运算解法
- 解法三:逻辑非解法
- 解法四:条件运算符解法
- 解法五:数组映射法
- 不同解法的比较
- 💯小结

💯题目
![]()
在蓝桥镇,妮妮发明了一个新的游戏——翻转游戏。游戏中有一个开关,可以处于两种状态:开(用 1 表示)和关(用 0 表示)。妮妮发现,无论开关当前处于何种状态,他都可以通过一次操作使得开关的状态翻转。现在,妮妮告诉你开关当前的状态 x,他想知道如果他做一次操作,开关的状态会变成什么。你能帮助他解答这个问题吗?
输入格式:
输入仅一行,包含一个整数 x (0 ≤ x ≤ 1),表示开关当前的状态。
输出格式:
输出一行,表示如果妮妮做一次操作后,开关的状态。
样例输入:
0
样例输出:
1
在这个样例中,开关当前的状态是关(0),所以妮妮做一次操作后,开关的状态会变为开(1)。
运行限制:
| 语言 | 最大运行时间 | 最大运行内存 |
|---|---|---|
| C++ | 1s | 128M |
| C | 1s | 128M |
| Java | 2s | 128M |
| Python3 | 3s | 128M |
💯问题分析
![]()
这个问题本质上是一个开关翻转问题,开关的状态只有两种:0 和 1。因此,我们可以很方便地通过数学运算、位运算、逻辑运算等多种方式实现翻转操作。接下来我们将以 C++ 为例,详细讲解每种方法的实现,并分析其思路和适用性。
解法一:减法法
这是最直观的一种解法,即利用数学运算来实现状态翻转。我们知道开关有两种状态:0 和 1。那么无论 x 的初始状态是 0 还是 1,都可以通过 1 - x 的方式得到翻转后的状态。

代码实现:
#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << 1 - x << endl;return 0;
}
思路分析:
对于当前状态 x:
- 如果
x为0,那么1 - x的结果为1。 - 如果
x为1,那么1 - x的结果为0。
通过简单的减法操作,我们可以实现状态的翻转。这种解法简单明了,代码也非常简洁,易于理解。其计算量为常数级别,时间复杂度为 O ( 1 ) O(1) O(1),适合大多数场景使用。
解法二:位运算解法
利用位运算的异或操作(^)实现状态翻转也是一种很高效的方法。在二进制逻辑中,异或操作可以用来做翻转。
0 ^ 1 = 11 ^ 1 = 0
也就是说,当前状态与 1 做异或运算,就可以实现翻转操作。

代码实现:
#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << (x ^ 1) << endl;return 0;
}
思路分析:
在 C++ 中,^ 是按位异或运算符。当两个位不同的时候,结果为 1,相同则为 0。因此 x ^ 1 的效果是:
- 当
x为0时,0 ^ 1得到1。 - 当
x为1时,1 ^ 1得到0。
这种解法的优点在于,它利用了位运算的高效性。位运算的执行速度通常比数学运算更快,因此在需要极高性能的场合,位运算是不错的选择。
解法三:逻辑非解法
我们还可以通过逻辑非运算符 ! 来实现状态翻转。在 C++ 中,逻辑非运算符 ! 可以将布尔值的真假互换。
!0 == true,转为整数就是1!1 == false,转为整数就是0

代码实现:
#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << !x << endl;return 0;
}
思路分析:
逻辑非运算符可以将 0 变为 1,将 1 变为 0。虽然逻辑非运算符通常用于布尔逻辑判断,但在这种只有 0 和 1 两个状态的问题中,也可以巧妙地应用。利用逻辑非运算符的结果自动转换为整数,可以实现状态翻转。
解法四:条件运算符解法
- 条件运算符(
? :)是 C++ 中的一种三目运算符,可以根据条件的真假执行不同的操作。在这个问题中,我们可以根据x的值选择输出1或0。

代码实现:
#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << (x == 0 ? 1 : 0) << endl;return 0;
}
思路分析:
该解法利用了条件运算符的特点:
- 当
x == 0时,输出1。 - 当
x != 0时,输出0。
这种方法的好处在于可读性很强,逻辑清晰明了,适合用来增强代码的可维护性。
解法五:数组映射法
- 我们可以定义一个数组,将开关状态映射到它翻转后的状态。利用数组的索引,可以很方便地实现状态翻转。

代码实现:
#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;int flip[2] = {1, 0}; // 定义翻转表cout << flip[x] << endl;return 0;
}
思路分析:
在这个解法中,我们定义了一个数组 flip,其中:
flip[0]为1flip[1]为0
输入的状态 x(只能是 0 或 1)可以直接作为数组的索引,通过查表的方式得到翻转后的状态。这种解法的优点在于,扩展性较好。如果将来状态种类增多,只需要扩展数组即可,代码的改动最小。
不同解法的比较
![]()
-
减法法 (
1 - x):- 优点:简单、直观,易于实现。
- 缺点:不够灵活,对于状态数较多的场景不适用。
-
位运算解法 (
x ^ 1):- 优点:利用位运算的高效性,性能优异。
- 缺点:代码可能对某些不熟悉位运算的程序员不够直观。
-
逻辑非解法 (
!x):- 优点:逻辑运算的方式实现状态翻转,简单易懂。
- 缺点:逻辑非运算符通常用于布尔类型,可能会降低代码的可读性。
-
条件运算符解法 (
x == 0 ? 1 : 0):- 优点:逻辑清晰,代码可读性强。
- 缺点:代码稍显冗长,相较于其他方法不够简洁。
-
数组映射法 (
flip[x]):- 优点:扩展性好,可以方便地增加状态种类。
- 缺点:对当前只有两种状态的情形而言,显得有些多余。
💯小结

如果代码简洁性和易读性是主要考虑因素,那么减法法 (1 - x) 是最优选择。- 如果需要追求极致的性能,或者对位运算熟悉且希望代码执行效率更高,位运算解法 (
x ^ 1) 是不错的选择。 - 如果问题需要在逻辑判断的基础上扩展为多状态翻转,数组映射法可以提高代码的扩展性和可维护性。.

相关文章:
【蓝桥杯C/C++】翻转游戏:多种实现与解法解析
博客主页: [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 💯题目💯问题分析解法一:减法法解法二:位运算解法解法三:逻辑非解法解法四:条件运算符解法解法五:数组映射法不同解法的比较…...
【AI系统】核心计算之矩阵乘
核心计算之矩阵乘 AI 模型中往往包含大量的矩阵乘运算,该算子的计算过程表现为较高的内存搬移和计算密度需求,所以矩阵乘的效率是 AI 芯片设计时性能评估的主要参考依据。本文我们一起来看一下矩阵乘运算在 AI 芯片的具体过程,了解它的执行性…...
Vue.js 自定义指令:从零开始创建自己的指令
vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令…...
策略模式
定义:即定义一系列的算法,算法1,算法2,...,算法n,把他们封装起来,使他们可以相互替换。 优点:使得一个类的行为或者其算法可以在运行时改变,而且使用Context类的人在外部…...
性能优化--CPU微架构
一 指令集架构 Intel X86, ARM v8, RISC-V 是当今广泛使用的指令架构的实例。 大多数现代架构可以归类为基于通用寄存器的加载和存储型架构,在这种架构下,操作数倍明确指定,只能使用夹在和存储指令访问内存。除提供基本的功能之外,…...
在 Sanic 框架中实现高效内存缓存的多种方法
在使用 Sanic 框架开发 Web 应用时,我们可以通过内存缓存来提升应用的性能,减少对数据库或其他外部服务的频繁请求。下面提供一些在 Sanic 中实现内存缓存的基本方法。 使用 Python 内置的 functools.lru_cache 如果你的缓存需求比较简单,且…...
Mac 环境变量配置基础教程
MacOS 下一般配置有多个 Shell,如 Bash、ZSH 等,不同的 Shell 其创建 Terminal 时使用的环境变量配置文件也不尽相同,但一般都会读取并执行脚本文件 /etc/profile 来加载系统级环境变量,而用户级别环境变量,一般都会在…...
Qt如何屏蔽工具栏(QToolBar)自动折叠功能
最近发现Qt上工具栏一行放不下的时候,会自动折叠起来。当用户点击展开功能的小三角按钮时,工具栏会展开成多行。这个功能本身没什么问题,但是当工具栏展开的时候,鼠标光标一旦不小心移动到了工具栏外面,这时候…...
【数据分享】中国统计摘要(1978-2024)
数据介绍 《中国统计摘要(1978 - 2024)》犹如一部浓缩的历史巨著,承载着中国几十年来的发展轨迹与辉煌成就。它是由国家统计局精心编纂的重要资料,为我们全方位地展现了中国在经济、社会、民生等各个领域的深刻变革。 这本统计摘…...
unity运行状态下移动、旋转、缩放控制模型
demo地址:https://download.csdn.net/download/elineSea/90017272 unity2021以上版本用下面的插件 https://download.csdn.net/download/elineSea/90017305...
《 C++ 点滴漫谈 一 》C++ 传奇:起源、演化与发展
摘要 C 是一门兼具高效性与灵活性的编程语言,自上世纪 80 年代诞生以来,已经深刻影响了计算机科学与技术的发展。从 Bjarne Stroustrup 的初步构想到如今遍布各大领域,C 经历了语言规范的不断完善与功能的持续扩展。本文详细回顾了 C 的起源…...
Github客户端工具github-desktop使用教程
文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…...
自然语言处理:第六十三章 阿里Qwen2 2.5系列
本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor 项目地址: QwenLM/Qwen2.5: Qwen2.5 is the large language model series developed by Qwen team, Alibaba Cloud. 官网地址: 你好,Qwen2 | Qwen & Qwen2.5: 基础模型大派对&a…...
springboot中设计基于Redisson的分布式锁注解
如何使用AOP设计一个分布式锁注解? 1、在pom.xml中配置依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.26</version></dependency><dependenc…...
C++初阶学习第十一弹——list的用法和模拟实现
目录 一、list的使用 二.list的模拟实现 三.总结 一、list的使用 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。 常见的list的函数的使用 std::list<int> It {1,…...
共享单车管理系统项目学习实战
前言 Spring Boot Vue前后端分离 前端:Vue(CDN) Element axios(前后端交互) BaiDuMap ECharts(图表展示) 后端:Spring Boot Spring MVC(Web) MyBatis Plus(数据库) 数据库:MySQL 验证码请求...
详细解读TISAX汽车信息安全评估
TISAX汽车信息安全评估是一个针对汽车行业的信息安全评估和交换机制,以下是对其的详细解读: 一、背景与目的 TISAX是在德国汽车工业协会(VDA)的支持下开发的,旨在确保跨公司边界的汽车行业信息安全评估的认可度&…...
gitlab cicd搭建及使用笔记(二)
cicd之gitlab-runner使用要点 官方链接:https://docs.gitlab.com/runner/ 附历史文章链接 https://blog.csdn.net/qq_42936727/article/details/143624523?spm1001.2014.3001.5501 gitlab-runner常用命令及解释 gitlab-runner verify 容器内,检查注…...
鸿蒙实战:页面跳转传参
文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战,学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目,编写首页代码,实现按钮跳转至第二个页面并…...
Spring Security SecurityContextHolder(安全上下文信息)
在本篇博客中,我们将讨论 Spring Security 的 SecurityContextHolder 组件,包括其实现方式、关键特性,并通过实际示例进行说明。 理解 SecurityContextHolder SecurityContextHolder 是 Spring Security 存储当前安全上下文详细信息的地方。…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
