C语言实现扫雷游戏(有展开一片和标记雷的功能)

实现准备

分2个.c源文件和1个.h头文件去写代码

  1. test.c 对扫雷游戏进行测试
  2. game.c 扫雷游戏功能的实现
  3. game.h 扫雷游戏功能的声明

扫雷游戏

1.test.c对扫雷游戏进行测试

首先我们要先把玩游戏的框架写出来,然后一步一步去完成其功能
跟着下面的代码的节奏走一步一步来,我会标记步骤
需要理解的地方,我都会解释,不理解的可以私信我

//scanf和printf需要用到该头文件
#include <stdio.h>//3
//菜单
void menu()
{printf("***********************\n");printf("***     1. play     ***\n");printf("***     0. exit     ***\n");printf("***********************\n");
}//4
//扫雷游戏的实现
//这个扫雷游戏的具体功能下面再说
void game()
{printf("扫雷游戏\n");//这里只是为了测试逻辑
}//2
void test()
{int input = 0;//用do while循环是让其上来就打印菜单以供我们选择do{menu();//菜单printf("请选择:");scanf("%d", &input);switch (input){case 1:game();//扫雷游戏的实现break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);//while()中放input是因为游戏退出的条件就是input为0
}//1
int main()
{test();//测试扫雷游戏return 0;
}

这样我们就搭建了一个扫雷游戏测试框架
下面我们对代码进行测试
在这里插入图片描述
接下来就是对扫雷游戏的实现

2.扫雷游戏的实现

接下来是test.c和game.c和game.h配合着实现扫雷游戏

在test.c的game()函数中

void game()
{char mine[11][11];//雷的信息char show[11][11];//展示界面
}

我们用两个字符数组:一个表示雷的信息,另一个是展示给玩家看的界面
实现9×9的扫雷棋盘,至于为什么它们的行和列都是11排查雷的时候会解释

因为11这个数字我们在这里会经常用到,而且为了使棋盘大小可以简易
变换,这里我们用到了#define

在game.h中

#pragma once#include <stdio.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2

这里为什么#define了ROW、ROWS和COL、COLS后面会说

那么在test.c的game()函数中

#include "game.h"void game()
{char mine[ROWS][COLS];//雷的信息char show[ROWS][COLS];//展示界面
}

在test.c中用了game.h的东西,要引用头文件game.h

为什么用" “而不用< >
自己写的用” " 编译器提供的用< >

为了方便直接把这里所有要用到的库函数的头文件全部放在game.h中
而在test.c中只用include “game.h” 就行了

接下来是初始化棋盘

初始化棋盘InitBoard

test.c的game()中

void game()
{char mine[ROWS][COLS];//雷的信息char show[ROWS][COLS];//展示界面//初始化棋盘InitBoard(mine, ROWS, COLS, '0');//'0'InitBoard(show, ROWS, COLS, '*');//'*'
}

把字符数组mine全部初始化为字符零’0’
把字符数组show全部初始化为字符星号’*’

game.h中

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int r, int c, char set);

对该函数进行声明,set是要初始化的字符是什么

game.c中

#include "game.h"void InitBoard(char board[ROWS][COLS], int r, int c, char set)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){board[i][j] = set;}}
}

运用for循环把字符数组初始化

接下来是打印棋盘

打印棋盘DisplayBoard

test.c的game()中

void game()
{char mine[ROWS][COLS];//雷的信息char show[ROWS][COLS];//展示界面//初始化棋盘InitBoard(mine, ROWS, COLS, '0');//'0'InitBoard(show, ROWS, COLS, '*');//'*'//打印棋盘DisplayBoard(show, ROW, COL);DisplayBoard(mine, ROW, COL);
}

我们只是要打印9×9的棋盘所以传参用ROW和COL

game.h中

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int r, int c);

game.c中

void DisplayBoard(char board[ROWS][COLS], int r, int c)
{printf("------扫雷游戏-------\n");int i = 0;for (i = 0; i <= c; i++){printf("%d ", i);//列}printf("\n");for (i = 1; i <= r; i++){printf("%d ", i);//行int j = 0;for (j = 1; j <= c; j++){printf("%c ", board[i][j]);}printf("\n");}
}

我们用图来表示如何实现
我们要知道的是打印11×11中的9×9
因为我们要实现9×9的棋盘
在这里插入图片描述
test.c的game()中

    //打印棋盘DisplayBoard(show, ROW, COL);//DisplayBoard(mine, ROW, COL);

这个mine数组的打印只是让我们看看是否真的初始化了
实际游戏中是不会打印它的

布置雷SetMine

test.c的game()中

void game()
{char mine[ROWS][COLS];//雷的信息char show[ROWS][COLS];//展示界面//初始化棋盘InitBoard(mine, ROWS, COLS, '0');//'0'InitBoard(show, ROWS, COLS, '*');//'*'//打印棋盘DisplayBoard(show, ROW, COL);//布置雷  //布置雷也是在9×9的棋盘中布置,所以传ROW和COLSetMine(mine, ROW, COL);DisplayBoard(mine, ROW, COL);//这里是布置完雷打印出来看看//是否真的布置雷了,真正玩游戏的时候是不可能把雷的位置打印出来的
}

game.h中

//布置雷
void SetMine(char mine[ROWS][COLS], int r, int c);

因为我们只会在mine数组中布置,所以这里的形参数组也直接用mine了
之前是因为两个数组都要用,所以用的board数组,board意思就是棋盘

game.c中

void SetMine(char mine[ROWS][COLS], int r, int c)
{int x = 0;int y = 0;int count = 0;while (count < EASYCOUNT){x = rand() % r + 1;y = rand() % c + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count++;}}
}

x和y是布置的雷的坐标
count起到计数的作用
EASYCOUNT是布置的雷的个数

在game.h中#define了

#define EASYCOUNT 10

简单版本是10个雷

rand()函数是生成随机数的函数
因为要让电脑随机布置雷
而rand()要配合srand()和time()使用
这三个函数我的猜数字游戏里讲到了这里就不讲怎么用了

	x = rand() % r + 1;y = rand() % c + 1;

因为要生成的坐标的范围是(1,1) -> (9,9)
这里 r 和 c 都是9,rand() % 9生成0 ~ 8的随机数 +1 就是1 ~ 9

在test.c的test()中

void test()
{srand((unsigned int)time(NULL));//生成一个随机数的生成起点int input = 0;下面是之前的代码,不展示了,占地方

在game.h中

#pragma once
#include <stdio.h>
#include <stdlib.h>//rand和srand要用的头文件
#include <time.h>//time要用的头文件#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define EASYCOUNT 10
下面的代码也不展示了

game.c的SetMine中

if (mine[x][y] == '0'){mine[x][y] = '1';count++;}

这段代码的意思的把mine数组中的 ‘0’ 改成 ‘1’
而 ‘0’ 表示不是雷,‘1’ 表示雷,直到布置10个雷。

下面图片展示
在这里插入图片描述
在这里插入图片描述

排查雷FindMine

在test.c的game()中

void game()
{char mine[ROWS][COLS];//雷的信息char show[ROWS][COLS];//展示界面//初始化棋盘InitBoard(mine, ROWS, COLS, '0');//'0'InitBoard(show, ROWS, COLS, '*');//'*'//打印棋盘DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);DisplayBoard(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}

排查雷两个数组都要用到
因为展示给玩家的是show数组
玩家在排查雷的时候,该函数要对照mine数组看看该坐标是不是雷

game.h中

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c);

game.c中

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c)
{int x = 0;//玩家输入的横坐标int y = 0;//玩家输入的纵坐标int win = 0;//获胜计数while (win < r * c - EASYCOUNT)//这里是有10个雷,那么获胜的条件就是排查出71个不是雷的坐标//win == 71 时,出循环{printf("请输入要排查的坐标:");scanf("%d%d", &x, &y);//输入的坐标必须合法//输入的坐标的合法性if (x >= 1 && x <= r && y >= 1 && y <= c)//合法条件{//排查过的坐标不能再次排查//判断该坐标是否已经被排查过if (show[x][y] == '*' || show[x][y] == '!')//我们是在show数组中排查的//'*'表示还没有排查过//'!'是标记雷,万一标记的地方不是雷但是我们标记了//也可以排查{//判断该坐标是否为雷if (mine[x][y] == '1')//是雷//用mine数组来看(x,y)坐标是不是雷{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, r, c);//游戏结束,展示哪里是雷break;//游戏结束,跳出循环}else//不是雷{//我们知道网页版的扫雷游戏,该坐标周围有雷的话,会显示雷的个数//这也就是mine和show为什么是11×11的原因//因为9×9的话,角落的坐标找周围雷的个数会越界访问//得到周围8个坐标的雷的个数int count = GetMineCount(mine, x, y);show[x][y] = count + '0';//把数字转为字符放在show数组中展示给玩家看if (count == 0){//展开一片win = UnfoldBoard(mine, show, x, y, win, r, c);}else{win++;}//得到雷得个数后进行展示DisplayBoard(show, r, c);//标记雷的位置MarkMine(show, r, c);}}else//排查过{printf("该坐标已经被排查过\n");}}else//不合法{printf("输入的坐标不合法\n");}}if (win == r * c - EASYCOUNT)//获胜条件{printf("恭喜你,排雷成功\n");}
}

得到周围雷得个数GetMineCount

game.c中

static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] +mine[x + 1][y] + mine[x + 1][y + 1] - (8 * '0');
}

周围有8个坐标
已知:
‘0’ - ‘0’ -> 0
‘1’ - ‘0’ -> 1

‘8’ - ‘0’ -> 8
所以把周围8个坐标的字符全部加起来再减去8个字符零就是周围雷的个数

展开一片UnfoldBoard

game.c中

static int UnfoldBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win, int r, int c,)
{//递归条件:递归的坐标必须合法if(x >= 1 && x <= r && y >= 1 && y <= c){if(mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y - 1] +mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] +mine[x + 1][y] + mine[x + 1][y + 1] - (8 * '0') == 0)//达到展开条件才递归{win++;//胜利计数show[x][y] = ' ';//将要递归的坐标改为空格int i = -1;int j = -1;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if(show[x+i][y+i] == '*'){win = UnfoldBoard(mine, show, x + i, y + i, win, r, c);//递归 返回win 胜利计数}}}}else{win++;//胜利计数int count = GetMineCount(mine, x, y);show[x][y] = count + '0';}}return win;//返回胜利计数
}

因为我们这里胜利的条件是win == 71,所以展开一片的时候必须记录win
否则win就到不了71了
展开一片的递归这里没法细讲,如果不理解可以私信我

标记雷的位置MarkMine

game.c中

static void MarkMine(char show[ROWS][COLS], int r, int c)
{printf("是否标记雷的位置: 1.标记  0.不标记\n");int input = 0;scanf("%d". &input);while(input){printf("请输入要标记的坐标:");int x = 0;int y = 0;scanf("%d %d", &x, &y);show[x][y] = '!';//'!'表示要标记的雷的位置DisplayBoard(show, r, c);//标记后展示printf("继续标记请输入:“1”,否则输入“0”\n");scanf("%d", &input);}
}

到了这里整个扫雷游戏就结束了
这里我们把雷的数量设置为2来测验一下
在这里插入图片描述

扫雷游戏完整代码

test.c的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void menu()
{printf("***********************\n");printf("***     1. play     ***\n");printf("***     0. exit     ***\n");printf("***********************\n");
}void game()
{char mine[ROWS][COLS];//雷的信息char show[ROWS][COLS];//展示界面//初始化棋盘InitBoard(mine, ROWS, COLS, '0');//'0'InitBoard(show, ROWS, COLS, '*');//'*'//打印棋盘DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);
}int main()
{test();return 0;
}

game.h的代码

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define EASYCOUNT 10//初始化棋盘
void InitBoard(char board[ROWS][COLS], int r, int c, char set);//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int r, int c);//布置雷
void SetMine(char mine[ROWS][COLS], int r, int c);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c);

game.c的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void InitBoard(char board[ROWS][COLS], int r, int c, char set)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){board[i][j] = set;}}
}void DisplayBoard(char board[ROWS][COLS], int r, int c)
{printf("------扫雷游戏-------\n");int i = 0;for (i = 0; i <= c; i++){printf("%d ", i);//列}printf("\n");for (i = 1; i <= r; i++){printf("%d ", i);//行int j = 0;for (j = 1; j <= c; j++){printf("%c ", board[i][j]);}printf("\n");}
}void SetMine(char mine[ROWS][COLS], int r, int c)
{int x = 0;int y = 0;int count = 0;while (count < EASYCOUNT){x = rand() % r + 1;y = rand() % c + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count++;}}
}static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] +mine[x + 1][y] + mine[x + 1][y + 1] - (8 * '0');
}static void MarkMine(char show[ROWS][COLS], int r, int c)
{printf("是否标记雷的位置: 1.标记  0.不标记\n");int input = 0;scanf("%d", &input);while (input){printf("请输入要标记的坐标:");int x = 0;int y = 0;scanf("%d %d", &x, &y);show[x][y] = '!';//标记'!'DisplayBoard(show, r, c);printf("继续标记请输入:“1”,否则输入“0”\n");scanf("%d", &input);}}static int UnfoldBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win, int r, int c)
{//递归x,y范围合法if (x >= 1 && x <= r && y >= 1 && y <= c){if (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] +mine[x + 1][y] + mine[x + 1][y + 1] - (8 * '0') == 0){show[x][y] = ' ';win++;int i = -1;int j = -1;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if (show[x + i][y + j] == '*'){win = UnfoldBoard(mine, show, x + i, y + j, win, r, c);}}}}else{win++;int count = GetMineCount(mine, x, y);show[x][y] = count + '0';}}return win;
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c)
{int x = 0;int y = 0;int win = 0;while (win < r * c - EASYCOUNT){printf("请输入要排查的坐标:");scanf("%d%d", &x, &y);//输入的坐标的合法性if (x >= 1 && x <= r && y >= 1 && y <= c){//判断该坐标是否已经被排查过if (show[x][y] == '*' || show[x][y] == '!'){//判断该坐标是否为雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, r, c);break;}else{//得到周围8个坐标的雷的个数int count = GetMineCount(mine, x, y);show[x][y] = count + '0';//展开一片if (count == 0){win = UnfoldBoard(mine, show, x, y, win, r, c);}else{win++;}DisplayBoard(show, r, c);//标记雷的位置MarkMine(show, r, c);}}else{printf("该坐标已经被排查过\n");}}else{printf("输入的坐标不合法\n");}}if (win == r * c - EASYCOUNT){printf("恭喜你,排雷成功\n");}
}

觉得不错的话给个三连哦!
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 仓库的 Archived 功能详解:中英双语

GitHub 仓库的 Archived 功能详解 一、什么是 GitHub 仓库的 “Archived” 功能&#xff1f; 在 GitHub 上&#xff0c;“Archived” 是一个专门用于标记仓库状态的功能。当仓库被归档后&#xff0c;它变为只读模式&#xff0c;所有的功能如提交代码、创建 issue 和 pull req…

基础IO(2)

基础IO&#xff08;2&#xff09; 理解“⼀切皆⽂件” ⾸先&#xff0c;在windows中是⽂件的东西&#xff0c;它们在linux中也是⽂件&#xff1b;其次⼀些在windows中不是⽂件的东西&#xff0c;⽐如进程、磁盘、显⽰器、键盘这样硬件设备也被抽象成了⽂件&#xff0c;你可以使…

Transformation,Animation and Viewing

4 Transformation&#xff0c;Animation and Viewing 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 4.1 Modeling Transformations 平移、缩放和旋转&#xff0c;即 OpenGL 的建模转换&…

Deepseek的RL算法GRPO解读

在本文中&#xff0c;我们将深入探讨Deepseek采用的策略优化方法GRPO&#xff0c;并顺带介绍一些强化学习&#xff08;Reinforcement Learning, RL&#xff09;的基础知识&#xff0c;包括PPO等关键概念。 策略函数&#xff08;policy&#xff09; 在强化学习中&#xff0c; a…

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

前端【8】HTML+CSS+javascript实战项目----实现一个简单的待办事项列表 (To-Do List)

目录 一、功能需求 二、 HTML 三、CSS 四、js 1、绑定事件与初始设置 2.、绑定事项 &#xff08;1&#xff09;添加操作&#xff1a; &#xff08;2&#xff09;完成操作 &#xff08;3&#xff09;删除操作 &#xff08;4&#xff09;修改操作 3、完整js代码 总结…

C++标准线程库实现优雅退出的方式

目录 1.通过设置共享退出标记 2.使用std::jthread创建线程 3.定义消息类型的方式 4.注意事项 1.通过设置共享退出标记 定义一个退出变量bool stop false; 表示线程是否应该停止。在主线程中设置标记stoptrue,然后join一直等待&#xff0c;然后线程循环检测到stop是否为tru…

Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)

JDBC插入记录语法及案例 一、JDBC插入记录语法 在JDBC中&#xff0c;插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下&#xff1a; INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名&#xff1a;需要插入记录的表的名称。列1, 列2, …,…

vue事件总线(原理、优缺点)

目录 一、原理二、使用方法三、优缺点优点缺点 四、使用注意事项具体代码参考&#xff1a; 一、原理 在Vue中&#xff0c;事件总线&#xff08;Event Bus&#xff09;是一种可实现任意组件间通信的通信方式。 要实现这个功能必须满足两点要求&#xff1a; &#xff08;1&#…

图像处理之HSV颜色空间

目录 1 RGB 的局限性 2 HSV 颜色空间 3 RGB与HSV相互转换 4 HSV颜色模型对图像的色相、饱和度和明度进行调节 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 RGB 的局限性 RGB 是我们接触最多的颜色空间&#xff0c;由三个通道表示一幅图像&#xff0c;分…

DeepSeek是由杭州深度求索人工智能基础技术研究有限公司(简称“深度求索”)发布的一系列人工智能模型

DeepSeek是由杭州深度求索人工智能基础技术研究有限公司&#xff08;简称“深度求索”&#xff09;发布的一系列人工智能模型&#xff0c;其在知识类任务上展现出了卓越的性能。以下是对DeepSeek的详细介绍&#xff0c;内容虽无法达到10000字&#xff0c;但会尽可能全面且深入地…

【C++高并发服务器WebServer】-9:多线程开发

本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…

在sortablejs的拖拽排序情况下阻止input拖拽事件

如题 问题 在vue3的elementPlus的table中&#xff0c;通过sortablejs添加了行拖拽功能&#xff0c;但是在行内会有输入框&#xff0c;此时拖拽输入框会触发sortablejs的拖拽功能 解决 基于这个现象&#xff0c;我怀疑是由于拖拽事件未绑定而冒泡到后面的行上从而导致的拖拽…

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…

leetcode_链表 876.链表的中间节点

876.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。思路&#xff1a;快慢指针&#xff0c;创建两个指针fast和slow&#xff0c;fast指针每次移动两步&#xff0c;slow指针每次移动…

深度学习 DAY3:NLP发展史及早期的前馈神经网络(ANN)及多任务学习

NLP发展史 NLP发展脉络简要梳理如下&#xff1a; 2001 - Neural language models&#xff08;神经语言模型&#xff09; 2008 - Multi-task learning&#xff08;多任务学习&#xff09; 2013 - Word embeddings&#xff08;词嵌入&#xff09; 2013 - Neural networks for NL…

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…

54.数字翻译成字符串的可能性|Marscode AI刷题

1.题目 问题描述 小M获得了一个任务&#xff0c;需要将数字翻译成字符串。翻译规则是&#xff1a;0对应"a"&#xff0c;1对应"b"&#xff0c;依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的…