22. 五子棋小游戏
文章目录
-
- 概要
- 整体架构流程
- 技术名词解释
- 技术细节
- 小结
1. 概要
🔊 JackQiao 对 米粒 说:“今天咱们玩个五子棋小游戏,电脑与你轮流在一个 n×n 的网格上放置棋子(X 或 O),网格由你输入的正整数n决定,谁先连成五个相同的棋子(横、竖或斜)即获胜。如果棋盘被填满且无人获胜,则游戏以平局结束”。
😇 米粒想到:
✅ 让用户输入棋盘的大小。
✅ 创建并初始化棋盘。
✅ 开始游戏循环,交替让玩家和电脑下棋。
✅ 每次下完棋后检查是否有人赢了或者棋盘是否满了。
✅ 如果有玩家赢了或棋盘满了,则结束游戏。
2. 整体架构流程
2.1. 包含的库
#include <stdio.h> #include <stdlib.h> #include <time.h>
📶 stdio.h:用于输入输出操作,比如打印信息和读取用户输入。
📶 stdlib.h:包含了一些有用的函数,比如随机数生成。
📶 time.h:用于获取当前时间,这里是为了设置随机数种子。
2.2. 定义符号常量
#define EMPTY ' ' #define PLAYER1 'X' // 黑棋 #define PLAYER2 'O' // 白棋
📶 EMPTY:表示空格,即没有棋子的地方。PLAYER1 和 PLAYER2:分别代表两个玩家的棋子,一个是 'X',另一个是 'O'。
2.3. 初始化棋盘
void init_board(char board[], int n) {for (int i = 0; i < n * n; i++){board[i] = EMPTY;} }
📶 这个函数用来初始化棋盘。它会把棋盘上的所有位置都设为空格(即没有棋子)。n 是棋盘的大小,比如如果 n=5,那么就是一个 5x5 的棋盘。
2.4. 打印棋盘
void print_board(char board[], int n) {// 打印列号printf(" ");for (int i = 0; i < n; i++) {printf("%2d ", i);}printf("\n");// 打印上边框printf(" +");for (int i = 0; i < n; i++) {printf("---+");}printf("\n");// 打印棋盘内容及行号for (int i = 0; i < n; i++) {printf("%2d|", i);for (int j = 0; j < n; j++) {printf(" %c |", board[i * n + j]);}printf("\n");// 打印行间的分隔线printf(" +");for (int j = 0; j < n; j++) {printf("---+");}printf("\n");} }
✅ 效果如下 :
2.4.1. 打印列号
printf(" "); for (int i = 0; i < n; i++) {printf("%2d ", i); } printf("\n");
📶 printf(" ");:这行代码打印了三个空格,用于对齐后续的行号。
📶 for (int i = 0; i < n; i++) { ... }:这个循环遍历棋盘的每一列,并为每一列打印一个编号。📶 printf("%2d ", i);:这里使用了格式化字符串 %2d 来确保每个数字占用至少两个字符的空间(如果数字是一位数,则前面会补一个空格),并在其后加上两个空格以增加可读性。📶 printf("\n");:打印完所有列号后,换行以便开始打印棋盘的上边框。
2.4.2. 打印上边框
printf(" +"); for (int i = 0; i < n; i++) {printf("---+"); } printf("\n");
📶 printf(" +");:打印两个空格和一个加号(+),作为左边界的起点。
📶 for (int i = 0; i < n; i++) { ... }:这个循环遍历棋盘的每一列,并为每一列打印一个由三个连字符(---)组成的分隔线,最后用一个加号结束。
📶 printf("\n");:打印完上边框后换行,准备打印棋盘内容。
2.4.3. 打印棋盘内容及行号
for (int i = 0; i < n; i++) {printf("%2d|", i);for (int j = 0; j < n; j++) {printf(" %c |", board[i * n + j]);}printf("\n");// 打印行间的分隔线printf(" +");for (int j = 0; j < n; j++) {printf("---+");}printf("\n"); }
📶 行号与棋盘内容
- for (int i = 0; i < n; i++) { ... }:这个外层循环遍历棋盘的每一行。
- printf("%2d|", i);:为当前行打印行号(同样使用 %2d 确保两位宽),然后打印竖线(|)表示该行的开始。
- 内层循环 for (int j = 0; j < n; j++) { ... } 遍历每一行中的每一个单元格:
- printf(" %c |", board[i * n + j]);:打印当前单元格的内容(即棋子或空格),并用竖线将其与其他单元格分隔开。
📶 行间分隔线
- 每一行内容打印完毕后,紧接着打印该行下方的分隔线。
- 这个部分与打印上边框的部分几乎相同,只是它位于每两行之间,而不是顶部。
2.5. 检查位置是否为空
int is_valid_move(char board[], int n, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= n) return 0;return board[x * n + y] == EMPTY; }
📶 这个函数检查给定的位置 (x, y) 是否在棋盘范围内并且是否为空。如果是的话,返回 1 表示可以下棋;否则返回 0。
2.6. 放置棋子
void make_move(char board[], int n, int x, int y, char player) {board[x * n + y] = player; }
📶 这个函数会在指定的位置 (x, y) 上放置玩家的棋子。
2.7. 检查是否有玩家获胜
int check_win(char board[], int n, int x, int y, char player) {int directions[8][2] = { {0, 1}, {1, 0}, {1, 1}, {1, -1}, {0, -1}, {-1, 0}, {-1, -1}, {-1, 1} };for (int d = 0; d < 8; d++) {int count = 1;for (int i = 1; i < 5; i++) {int nx = x + directions[d][0] * i;int ny = y + directions[d][1] * i;if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx * n + ny] == player) {count++;}else {break;}}for (int i = 1; i < 5; i++) {int nx = x - directions[d][0] * i;int ny = y - directions[d][1] * i;if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx * n + ny] == player) {count++;}else {break;}}if (count >= 5) return 1;}return 0; }
2.7.1. 定义搜索方向
int directions[8][2] = { {0, 1}, {1, 0}, {1, 1}, {1, -1}, {0, -1}, {-1, 0}, {-1, -1}, {-1, 1} };
- 📶 directions 是一个二维数组,存储了八个方向的增量值。
- 📶 {0, 1} 表示向右移动(横向)。
- 📶 {1, 0} 表示向下移动(纵向)。
- 📶 {1, 1} 表示右下对角线。
- 📶 {1, -1} 表示左下对角线。
- 📶 {0, -1} 表示向左移动(横向)。
- 📶 {-1, 0} 表示向上移动(纵向)。
- 📶 {-1, -1} 表示左上对角线。
- 📶 {-1, 1} 表示右上对角线。
2.7.2. 检查方向
for (int i = 1; i < 5; i++){int nx = x + directions[d][0] * i;int ny = y + directions[d][1] * i;if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx * n + ny] == player) {count++;} else {break;} }
- 内层第一个循环沿着当前方向的正方向(即增加方向)检查最多4个位置。
- nx 和 ny 计算了在当前位置 (x, y) 沿着当前方向移动 i 步后的新坐标。
- 如果新坐标在棋盘范围内,并且该位置的棋子与当前玩家相同,则增加计数器 count。
- 如果遇到边界或不同棋子,则停止检查该方向
2.8. 电脑玩家随机移动
void make_computer_move(char board[], int n, char player) {int x, y;do {x = rand() % n;y = rand() % n;} while (!is_valid_move(board, n, x, y));printf("电脑玩家 %c 下在 (%d, %d)\n", player, x, y);make_move(board, n, x, y, player); }
2.9. 主函数
int main() {int n;printf("请输入棋盘大小 n: ");scanf("%d", &n);char* board = (char*)malloc(n * n * sizeof(char));if (!board) {printf("内存分配失败\n");return 1;}srand(time(NULL)); // 初始化随机数种子init_board(board, n);char current_player = PLAYER1;int x, y;while (1) {print_board(board, n);if (current_player == PLAYER1) {printf("玩家 %c,请输入坐标 (x y): ", current_player);scanf("%d %d", &x, &y);if (!is_valid_move(board, n, x, y)) {printf("无效的移动,请重新输入。\n");continue;}make_move(board, n, x, y, current_player);}else {make_computer_move(board, n, current_player);}if (check_win(board, n, x, y, current_player)) {print_board(board, n);printf("玩家 %c 获胜!\n", current_player);free(board);return 0;}if (is_board_full(board, n)) {print_board(board, n);printf("平局!\n");free(board);return 0;}current_player = (current_player == PLAYER1) ? PLAYER2 : PLAYER1;}free(board);return 0; }
2.10. 程序运行如下:
3. 技术名词解释
🔔 directions 是一个二维数组,存储了八个方向的增量值。
- 📶 directions 是一个二维数组,存储了八个方向的增量值。
- 📶 {0, 1} 表示向右移动(横向)。
- 📶 {1, 0} 表示向下移动(纵向)。
- 📶 {1, 1} 表示右下对角线。
- 📶 {1, -1} 表示左下对角线。
- 📶 {0, -1} 表示向左移动(横向)。
- 📶 {-1, 0} 表示向上移动(纵向)。
- 📶 {-1, -1} 表示左上对角线。
- 📶 {-1, 1} 表示右上对角线。
4. 技术细节
-
检查相应方
for (int i = 1; i < 5; i++){int nx = x - directions[d][0] * i;int ny = y - directions[d][1] * i;if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx * n + ny] == player){count++;} else
{break;}
}
✅ 整体代码
#include <stdio.h> #include <stdlib.h> #include <time.h>#define EMPTY ' ' #define PLAYER1 'X' // 黑棋 #define PLAYER2 'O' // 白棋// 初始化棋盘 void init_board(char board[], int n) {for (int i = 0; i < n * n; i++){board[i] = EMPTY;} }// 打印棋盘 void print_board(char board[], int n) {// 打印列号printf(" ");for (int i = 0; i < n; i++) {printf("%2d ", i);}printf("\n");// 打印上边框printf(" +");for (int i = 0; i < n; i++) {printf("---+");}printf("\n");// 打印棋盘内容及行号for (int i = 0; i < n; i++) {printf("%2d|", i);for (int j = 0; j < n; j++) {printf(" %c |", board[i * n + j]);}printf("\n");// 打印行间的分隔线printf(" +");for (int j = 0; j < n; j++) {printf("---+");}printf("\n");} }// 检查位置是否为空 int is_valid_move(char board[], int n, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= n) return 0;return board[x * n + y] == EMPTY; }// 放置棋子 void make_move(char board[], int n, int x, int y, char player) {board[x * n + y] = player; }// 检查是否有玩家获胜 int check_win(char board[], int n, int x, int y, char player) {int directions[8][2] = { {0, 1}, {1, 0}, {1, 1}, {1, -1}, {0, -1}, {-1, 0}, {-1, -1}, {-1, 1} };for (int d = 0; d < 8; d++) {int count = 1;for (int i = 1; i < 5; i++) {int nx = x + directions[d][0] * i;int ny = y + directions[d][1] * i;if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx * n + ny] == player) {count++;}else {break;}}for (int i = 1; i < 5; i++) {int nx = x - directions[d][0] * i;int ny = y - directions[d][1] * i;if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx * n + ny] == player) {count++;}else {break;}}if (count >= 5) return 1;}return 0; }// 检查棋盘是否已满 int is_board_full(char board[], int n) {for (int i = 0; i < n * n; i++) {if (board[i] == EMPTY) return 0;}return 1; }// 电脑玩家随机移动 void make_computer_move(char board[], int n, char player) {int x, y;do {x = rand() % n;y = rand() % n;} while (!is_valid_move(board, n, x, y));printf("电脑玩家 %c 下在 (%d, %d)\n", player, x, y);make_move(board, n, x, y, player); }int main() {int n;printf("请输入棋盘大小 n: ");scanf("%d", &n);char* board = (char*)malloc(n * n * sizeof(char));if (!board) {printf("内存分配失败\n");return 1;}srand(time(NULL)); // 初始化随机数种子init_board(board, n);char current_player = PLAYER1;int x, y;while (1) {print_board(board, n);if (current_player == PLAYER1) {printf("玩家 %c,请输入坐标 (x y): ", current_player);scanf("%d %d", &x, &y);if (!is_valid_move(board, n, x, y)) {printf("无效的移动,请重新输入。\n");continue;}make_move(board, n, x, y, current_player);}else {make_computer_move(board, n, current_player);}if (check_win(board, n, x, y, current_player)) {print_board(board, n);printf("玩家 %c 获胜!\n", current_player);free(board);return 0;}if (is_board_full(board, n)) {print_board(board, n);printf("平局!\n");free(board);return 0;}current_player = (current_player == PLAYER1) ? PLAYER2 : PLAYER1;}free(board);return 0; }
5. 小结
✅ 针对该小游戏,米粒做出以下知识点总结:
🌷 数据结构:使用一维数组 char board[] 来表示二维棋盘,通过索引计算 [x * n + y] 来访问特定位置。
🌷 算法逻辑:通过遍历八个方向来检查每次落子后是否形成五子连珠,使用方向增量数组 directions[8][2] 来简化不同方向上的搜索。
🌷 用户交互:程序包含输入输出功能,如读取用户输入坐标、打印当前棋盘状态,并处理非法输入和游戏结束条件(胜利或平局)。
相关文章:
22. 五子棋小游戏
文章目录 概要整体架构流程技术名词解释技术细节小结 1. 概要 🔊 JackQiao 对 米粒 说:“今天咱们玩个五子棋小游戏,电脑与你轮流在一个 nn 的网格上放置棋子(X 或 O),网格由你输入的正整数n决定࿰…...
fastadmin框架同时使用 阿里云oss和阿里云点播
背景 项目的实际需求中既要用到阿里云oss产品又用到阿里云点播系统,实现完美的统一。设置两个地址downUrl,thirdCode。分别代表阿里云oss上传路径和阿里云点播系统vId。 实现 默认框架你已经集成好阿里云oss集成工作,前端html页面实现 <…...
Java-JMX 组件架构即详解
JMX架构由三个主要组件构成: MBeans(Managed Beans):代表可管理的资源,是JMX的核心。MBean可以是Java类或接口,提供了管理操作的接口,如获取系统信息、设置参数等。MBeanServer&#x…...
unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function
发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…...
java+ssm+mysql校园物品租赁网
项目介绍: 使用javassmmysql开发的校园物品租赁网,系统包含管理员、用户角色,功能如下: 管理员:用户管理;物品管理(物品种类、物品信息、评论信息);订单管理࿱…...
Spring Boot中实现JPA多数据源配置指南
本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始,到配置数据源、创建DataSource bean、定义实体和Repository,最后到配置事务管理器和使用多数据…...
服务器加固
1.服务器密码复杂度 密码最小长度,密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit:大写字母个数;lcredit:小写字母个数;dcredit:数字个数;ocredit:…...
探索CSS中的背景图片属性,让你的网页更加美观
导语:在网页设计中,背景图片的运用能够丰富页面视觉效果,提升用户体验。本文将详细介绍CSS中背景图片的相关属性,帮助大家更好地掌握这一技能。 一、背景图片基本属性 1、background-image 该属性用于设置元素的背景图片。语法如…...
Oracle的打开游标(OPEN_CURSORS)
一、OPEN_CURSORS 概述 OPEN_CURSORS 指定会话一次可以拥有的打开游标(私有 SQL 区域的句柄)的最大数量。可以使用此参数来防止会话打开过多的游标。 OPEN_CURSORS参数说明 特性 描述 参数类型 Integer 默认值 50 修改方式 ALTER SYSTEM PDB级别…...
数值分析—数值积分
研究背景 积分的数学解法为牛顿莱布尼兹公式,数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫abf(x)dxF(b)−F(a),但应用该方法有如下困难: 1, f ( x ) f(x) f(x)的原函数有时不能用初等函…...
克服大规模语言模型限制,构建新的应用方法——LangChain
大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命,改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展,大模型的数据集(包括多模态数据集)制作已经形成了规约,Meta、Go…...
计算机网络 —— HTTPS 协议
前一篇文章:计算机网络 —— HTTP 协议(详解)-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书? 2.中间人能否调…...
React第十七章(useRef)
useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时,便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value,其次就是vu…...
React第十五节useReducer使用详解差异
useReducer() 的用法注意事项 1、 概述: useReducer() 常用于管理复杂的状态更新逻辑,特别是在状态更新依赖于多个条件或动作时,useReducer 提供了一种更加结构化和可维护的方式来处理状态。可以将更新函数写在组件外面 它与 useState() 相…...
NanoLog起步笔记-5-客户端简要描述
nonolog起步笔记-5-客户端简要描述 客户端的简要的设计图路notify模式服务端最好分两个核 NanoLog::setLogLevel(NOTICE);从 NANO_LOG 开始NANO_LOGcompiling time的语句getNumNibblesNeeded:得到prompt中,number的数量countFmtParams:得到所…...
Flink:入门介绍
目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…...
目标跟踪领域经典论文解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
网络编程 | TCP套接字通信及编程实现经验教程
1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一,它为互联网上的数据传输提供了可靠性和连接管理。 TCP(Transmission Control Protocol,传输控制协议…...
SAP导出表结构并保存到Excel 源码程序
SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果...
Linux下redis环境的搭建
1.redis的下载 redis官网下载redis的linux压缩包,官网地址:Redis下载 网盘链接: 通过网盘分享的文件:redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…...
REDMI瞄准游戏赛道,推出小屏平板
近日,REDMI推出了一款8.8英寸的小屏平板,引发市场关注。该平板采用LCD屏幕,搭载天玑9400处理器,定位游戏市场,意在开拓小屏平板的新领域。 小屏平板新尝试 这款REDMI平板未追随大屏潮流,而是选择了8…...
springai结合ollama
目录 ollama 介绍 使用 下载: 安装: 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网:Ollama Ollama是一个用于部署和运行各种开源大模型的工具; …...
React第十三节开发中常见问题之(视图更新、事件处理)
一、视图更新有哪些方案? useState用法介绍 1、对于数据变量 正常的增删改查,只会让数据更新,但是不会触发 React 视图的更新; 如: <script lang"jsx">const baseTable [{name:Andy, age: 18, id…...
【Appium报错】安装uiautomator2失败
目录 1、通过nmp安装uiautomator2:失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2:失败 我先是通过npm安装的uiautomator2,也显示已经安装成功了: npm install -g …...
DataSophon集成CMAK KafkaManager
本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件:DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…...
Ubuntu22.04深度学习环境安装【显卡驱动安装】
前言 使用Windows配置环境失败,其中有一个包只有Linux版本,Windows版本的只有python3.10的,所以直接选用Linux来配置环境,显卡安装比较麻烦,单独出一期。 显卡驱动安装 方法一:在线安装(操作…...
21届秋/校招面经
开篇先说一下我自身情况,东南大学本科计算机科学与技术专业毕业,gpa3.2/4.8。零零散散搞过一年多ACM,去年(2019)在icpc上海站拿了铜之后增加了信心(因为当时训练总时间半年不到),于是…...
相机动态/在线标定
图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…...
MySQL 8.0 新特性汇总
文章目录 前言1. 运维管理 1.1 可持久化变量1.2 管理员端口1.3 资源组1.4 数据库粒度只读1.5 show processlist 实现方式1.6 加速索引创建速度1.7 控制连接的内存使用量1.8 克隆插件1.9 mysqldump 新增参数1.10 慢日志增强1.11 快速加列1.12 InnoDB 隐藏主键1.13 Redo 配置1.14…...
Resnet C ++ 部署 tensort 部署(四)
Resnet C 部署 pytorch功能测试(一) Resnet C 部署 模型训练(二) Resnet C 部署 模型测试&转 onnx(三) Resnet C 部署 tensort 部署(四) 之后,开始onnx 转trt 部…...
wordpress更换style/惠州网站关键词排名
文章目录1、git reset --soft命令介绍2、示例详解git reset命令可以实现Git版本回退,其有三个选项,可以完成三种不同效果的回退。1、git reset --soft命令介绍 git reset --soft commit-id命令:回退到指定版本。(soft:…...
做公司网站需要哪些资料/百度指数属于行业趋势及人群
以下均为博主亲测的可靠流程,其中有一些我遇到的问题及解决方法,希望能帮到大家,不再踩坑,也欢迎大家交流遇到的问题和配置方法。 CUDA(10.2)+PyTorch安装加配置 详细完整教程检查是否支持CUDA安…...
小企业网站开发论文/北京网站建设公司大全
我在做 iOS 开发的时候,发现自己在写程序的时候,常常处于两种状态的切换,我把这两种状态称为软件开发的上帝模式与农民模式。我先给大家介绍一下这两种模式的特点。 上帝模式 处于上帝模式时,我需要构思整个应用的架构设计&#x…...
泸州做网站公司/手机建网站软件
隐写3 打开是一张图片 winhex打开没发现异常 winhex改一下长高后发现碰巧出了flag zip伪加密 简单题 winhex打开后将图片的09改为00即可解伪加密 赛博朋克 打开是一个txt打开发现有PNG前缀 于是改后缀为png 发现一张图片 winhex查看后发现有Steganography字样 就猜测为LS…...
东莞微信网站制作/百度网站推广怎么收费
你喜欢做程序员吗?如果喜欢,那就做一辈子吧,甚至可以去创造一门语言 开心一笑 【甲:唉,我失败了。 乙:没关系,失败并不可耻。 甲:嗯,失败并不可耻。 乙:对…...
深圳住建厅官方网站/web网页制作成品免费
广义表是数据结构中非常关键的一部分,它的学习对于树和二叉树有很大的起承作用。那么,它是怎么实现的呢?广义表的实现应用到了一个很熟悉的算法——递归。来看看它的代码吧!#pragma once #include<iostream> #include<ca…...