当前位置: 首页 > news >正文

大兴西红门网站建设网络营销知识

大兴西红门网站建设,网络营销知识,日本向中国收二维码费用,国学底蕴的公司名字广度优先搜索算法1 思考问题1.1 这个迷宫需不需要指定入口和出口?2 先粗略实现2.1 源码2.2 源码解释3 优化代码3.1 优化读取文件部分3.2 增加错误处理4 再优化-让程序变得更加灵活4.1 用户外部可以循环输入入口和出口5 完整代码这是一个提问者的提出的问题&#xff…

广度优先搜索算法

  • 1 思考问题
    • 1.1 这个迷宫需不需要指定入口和出口?
  • 2 先粗略实现
    • 2.1 源码
    • 2.2 源码解释
  • 3 优化代码
    • 3.1 优化读取文件部分
    • 3.2 增加错误处理
  • 4 再优化-让程序变得更加灵活
    • 4.1 用户外部可以循环输入入口和出口
  • 5 完整代码

这是一个提问者的提出的问题: 连接

数据结构算法,用C语言完成,
迷宫寻路:以一个的长方阵表示迷宫,用0和1分别表示迷宫中的通路和障碍,将迷宫的长方阵存储在相关数据文件中,迷宫数据从该文件中读取。找到一条从入口到出口的通路,或得到没有通路的结论。将找到的通路以三元组的形式输出,表示经过节点的坐标,表示从入口出发达到该节点的距离,每走一步距离加1。最终输出全部通路,并统计路径距离。

经过我们的讨论,我决定重新实现我之前的算法!以下是完整内容

1 思考问题

1.1 这个迷宫需不需要指定入口和出口?

我之前提供的算法是默认起点为左上角,终点为右下角。如果你的迷宫入口或者出口为“1”,这将导致无法找到路径;这也就解释了,为什么你的迷宫会出现这样的结果!

根据的你的提供迷宫,我猜测,你的想法可能是:这个迷宫不需要指定出口和入口,而是让程序自己找。
这样的情况算法实现起来会更复杂,更困难,需要加很多个约束条(比如,入口不能是出口等)!
根据之前的沟通,我感觉您像是初学者(如果我猜错了,冒犯到您,向您道歉),应该不会一上来就挑战那么难的算法!所以这个算法应该是指定入口和出口的,这样就会让程序变得简单很多!

2 先粗略实现

2.1 源码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int x;int y;int distance;
} Node;void BFS(int maze[][MAX_SIZE], int n, int m, int startX, int startY, int endX, int endY) {// 定义方向数组,表示上下左右四个方向int dx[4] = { -1, 1, 0, 0 };int dy[4] = { 0, 0, -1, 1 };// 定义队列和标记数组Node queue[MAX_SIZE * MAX_SIZE];int front = 0, rear = 0;bool visited[MAX_SIZE][MAX_SIZE] = { false };Node parentMap[MAX_SIZE][MAX_SIZE];// 将起点加入队列中Node start = { startX, startY, 0 };queue[rear++] = start;visited[startX][startY] = true;// 开始广度优先搜索while (front < rear) {// 取出队列中的节点Node curr = queue[front++];// 检查是否到达终点if (curr.x == endX && curr.y == endY) {printf("Find a path: ");printf("(%d,%d,%d)", curr.x, curr.y, curr.distance);Node parent = parentMap[curr.x][curr.y];while (parent.x != startX || parent.y != startY) {printf(" <- ");printf("(%d,%d,%d)", parent.x, parent.y, parent.distance);parent = parentMap[parent.x][parent.y];}printf(" <- ");printf("(%d,%d,0)\n", startX, startY);continue;}// 访问相邻节点for (int i = 0; i < 4; i++) {int nx = curr.x + dx[i];int ny = curr.y + dy[i];if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && !visited[nx][ny]) {Node next = { nx, ny, curr.distance + 1 };queue[rear++] = next;visited[nx][ny] = true;parentMap[nx][ny] = curr;}}}
}int main() {// 从文件中读取迷宫数据int maze[MAX_SIZE][MAX_SIZE];int n, m;FILE *fp = fopen("maze.txt", "r");fscanf(fp, "%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {fscanf(fp, "%d", &maze[i][j]);}}fclose(fp);// 确定起点和终点int startX = 0,startY = 0, endX = n - 1, endY = m - 1;// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);return 0;
}

2.2 源码解释

#define _CRT_SECURE_NO_WARNINGS

我的编译器使用的是vs2017,而我在代码中使用了fopen等函数,编译器认为:使用的是不安全的C标准库函数fopen(),建议使用更安全的fopen_s()函数来代替。但是没有必要,所以我加上了这行代码,让编译器忽略这个警告。如果你的编译器运行我之前的代码,编译没有报错,你也可以将这一行去掉。

	int startX = 0,startY = 0, endX = n - 1, endY = m - 1;

这一行是在main函数中的,他的目的就是确定迷宫的入口和出口,默认是左上到右下,你可以通过更改数值实现,自定义入口和出口。
例如:起点(0,1);终点(6,8)

int startX = 0,startY = 1, endX = 6, endY = 7;

这里我提供一个7X9迷宫:

7 9
1 0 0 0 1 0 1 1 0
0 1 0 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1
1 1 0 1 0 1 0 0 0
0 0 0 1 0 0 0 1 1
1 1 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0 0

你可能注意到了,我的迷宫结构和之前提供给你的迷宫结构发生了变化,在开始处,增加了迷宫的大小“7 9”,这是告诉程序我迷宫的大小,也就是说,现在的迷宫大小我们也可以是自定义的了
运行结果:

在这里插入图片描述

代码已经可以实现了!

3 优化代码

3.1 优化读取文件部分

以下是将读取迷宫数据部分的代码封装成一个函数 readMaze,并添加了判断文件是否成功打开的代码:

bool readMaze(const char *filename, int maze[][MAX_SIZE], int *n, int *m) {FILE *fp = fopen(filename, "r");if (!fp) {printf("Error: Failed to open file %s.\n", filename);return false;}fscanf(fp, "%d%d", n, m);for (int i = 0; i < *n; i++) {for (int j = 0; j < *m; j++) {fscanf(fp, "%d", &maze[i][j]);}}fclose(fp);return true;
}

然后,在 main 函数中调用该函数读取迷宫数据

int main() {int maze[MAX_SIZE][MAX_SIZE];int n, m;if (!readMaze("maze.txt", maze, &n, &m)) {return 1;}// 确定起点和终点int startX = 0, startY = 0, endX = n-1, endY = m-1;//注意:可以自定义// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);return 0;
}

这样做的好处是,将读取迷宫数据的代码封装成一个函数,可以使 main 函数更加清晰简洁,也方便在其他函数中重复使用该代码。另外,添加判断文件是否成功打开的代码,可以在打开文件失败时及时提示用户,并退出程序。

3.2 增加错误处理

  1. 判断自定义的迷宫入口和出口是否合法,比如说,刚才迷宫大小为7*9,你却定义一个出口为(10,11),那么这个出口肯定是越界了
  2. 以及判断你自定义迷宫入口和出口是否合法,也就是说,如果你设计迷宫入口或者出口为“1”,也是不合理的。
    一个函数实现这两个功能
bool isValidPoint(int maze[][MAX_SIZE], int n, int m, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= m) {return false;}if (maze[x][y] != 0) {return false;}return true;
}

然后,我们可以在 BFS 函数和 main 函数中使用该函数来检查起点和终点的合法性。例如,在 BFS 函数中,可以将下面这行代码:

if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && !visited[nx][ny]) {

修改为:

if (isValidPoint(maze, n, m, nx, ny) && !visited[nx][ny]) {

在 main 函数中,可以添加以下代码来检查起点和终点的合法性:

if (!isValidPoint(maze, n, m, startX, startY)) {printf("Error: Invalid start point (%d,%d).\n", startX, startY);return 1;
}
if (!isValidPoint(maze, n, m, endX, endY)) {printf("Error: Invalid end point (%d,%d).\n", endX, endY);return 1;
}

这样,当输入的起点或终点不合法时,程序会输出错误信息并退出。
我们使用刚才的迷宫进行测试,起点设置为(0,0)
运行如下:
在这里插入图片描述
因为刚才的迷宫入口为1,所以给出了(0,0)位置无效的提示,其他的可以自行测试!

4 再优化-让程序变得更加灵活

4.1 用户外部可以循环输入入口和出口

输入格式为0,1英文逗号隔开

int main() {int maze[MAX_SIZE][MAX_SIZE];int n, m;if (!readMaze("maze.txt", maze, &n, &m)) {return 1;}// 从键盘输入起点和终点的坐标int startX, startY, endX, endY;while (1) {printf("Please enter the start point (x,y), or enter -1 to quit: ");int len = scanf("%d,%d", &startX, &startY);if (len == 1 && startX == -1)break;if ( len != 2) {printf("Error: Invalid input for start point.\n");continue;}if (!isValidPoint(maze, n, m, startX, startY)) {printf("Error: Invalid start point (%d,%d).\n", startX, startY);continue;}printf("Please enter the end point (x,y): ");if (scanf("%d,%d", &endX, &endY) != 2) {printf("Error: Invalid input for end point.\n");continue;}if (!isValidPoint(maze, n, m, endX, endY)) {printf("Error: Invalid end point (%d,%d).\n", endX, endY);continue;}// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);}return 0;
}

运行结果:
在这里插入图片描述

5 完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int x;int y;int distance;
} Node;bool isValidPoint(int maze[][MAX_SIZE], int n, int m, int x, int y) {if (x < 0 || x >= n || y < 0 || y >= m) {return false;}if (maze[x][y] != 0) {return false;}return true;
}bool readMaze(const char *filename, int maze[][MAX_SIZE], int *n, int *m) {FILE *fp = fopen(filename, "r");if (!fp) {printf("Error: Failed to open file %s.\n", filename);return false;}fscanf(fp, "%d%d", n, m);for (int i = 0; i < *n; i++) {for (int j = 0; j < *m; j++) {fscanf(fp, "%d", &maze[i][j]);}}fclose(fp);return true;
}void BFS(int maze[][MAX_SIZE], int n, int m, int startX, int startY, int endX, int endY) {// 定义方向数组,表示上下左右四个方向int dx[4] = { -1, 1, 0, 0 };int dy[4] = { 0, 0, -1, 1 };// 定义队列和标记数组Node queue[MAX_SIZE * MAX_SIZE];int front = 0, rear = 0;bool visited[MAX_SIZE][MAX_SIZE] = { false };Node parentMap[MAX_SIZE][MAX_SIZE];// 将起点加入队列中Node start = { startX, startY, 0 };queue[rear++] = start;visited[startX][startY] = true;// 开始广度优先搜索while (front < rear) {// 取出队列中的节点Node curr = queue[front++];// 检查是否到达终点if (curr.x == endX && curr.y == endY) {printf("Find a path: ");printf("(%d,%d,%d)", curr.x, curr.y, curr.distance);Node parent = parentMap[curr.x][curr.y];while (parent.x != startX || parent.y != startY) {printf(" <- ");printf("(%d,%d,%d)", parent.x, parent.y, parent.distance);parent = parentMap[parent.x][parent.y];}printf(" <- ");printf("(%d,%d,0)\n", startX, startY);continue;}// 访问相邻节点for (int i = 0; i < 4; i++) {int nx = curr.x + dx[i];int ny = curr.y + dy[i];if (isValidPoint(maze, n, m, nx, ny) && !visited[nx][ny]) {Node next = { nx, ny, curr.distance + 1 };queue[rear++] = next;visited[nx][ny] = true;parentMap[nx][ny] = curr;}}}
}int main() {int maze[MAX_SIZE][MAX_SIZE];int n, m;if (!readMaze("maze.txt", maze, &n, &m)) {return 1;}// 从键盘输入起点和终点的坐标int startX, startY, endX, endY;while (1) {printf("Please enter the start point (x,y), or enter -1 to quit: ");int len = scanf("%d,%d", &startX, &startY);if (len == 1 && startX == -1)break;if ( len != 2) {printf("Error: Invalid input for start point.\n");continue;}if (!isValidPoint(maze, n, m, startX, startY)) {printf("Error: Invalid start point (%d,%d).\n", startX, startY);continue;}printf("Please enter the end point (x,y): ");if (scanf("%d,%d", &endX, &endY) != 2) {printf("Error: Invalid input for end point.\n");continue;}if (!isValidPoint(maze, n, m, endX, endY)) {printf("Error: Invalid end point (%d,%d).\n", endX, endY);continue;}// 使用广度优先搜索算法搜索最短路径BFS(maze, n, m, startX, startY, endX, endY);}return 0;
}

maze.txt内容

7 9
1 0 0 0 1 0 1 1 0
0 1 0 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1
1 1 0 1 0 1 0 0 0
0 0 0 1 0 0 0 1 1
1 1 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0 0

文章转载自:
http://buoyancy.dkqr.cn
http://wertherian.dkqr.cn
http://miaul.dkqr.cn
http://aestidurilignosa.dkqr.cn
http://devout.dkqr.cn
http://pion.dkqr.cn
http://actualization.dkqr.cn
http://bhave.dkqr.cn
http://gateleg.dkqr.cn
http://layoff.dkqr.cn
http://unabashed.dkqr.cn
http://rhinosalpingitis.dkqr.cn
http://catalan.dkqr.cn
http://vitrifiable.dkqr.cn
http://abbreviation.dkqr.cn
http://strobe.dkqr.cn
http://wipeout.dkqr.cn
http://noelle.dkqr.cn
http://kharg.dkqr.cn
http://rustless.dkqr.cn
http://clarinda.dkqr.cn
http://hepatatrophia.dkqr.cn
http://room.dkqr.cn
http://cenesthesis.dkqr.cn
http://washy.dkqr.cn
http://evergreen.dkqr.cn
http://symbolist.dkqr.cn
http://hohum.dkqr.cn
http://begrudgingly.dkqr.cn
http://bintree.dkqr.cn
http://hindlimb.dkqr.cn
http://secretive.dkqr.cn
http://flavorful.dkqr.cn
http://remigrate.dkqr.cn
http://qiviut.dkqr.cn
http://aragonite.dkqr.cn
http://editorialize.dkqr.cn
http://happify.dkqr.cn
http://kcb.dkqr.cn
http://interlaminate.dkqr.cn
http://legitimation.dkqr.cn
http://albigenses.dkqr.cn
http://fortunebook.dkqr.cn
http://foregrounding.dkqr.cn
http://disinterment.dkqr.cn
http://reassemble.dkqr.cn
http://esthesiometry.dkqr.cn
http://unraced.dkqr.cn
http://hypogonadism.dkqr.cn
http://prooflike.dkqr.cn
http://collarwork.dkqr.cn
http://iamap.dkqr.cn
http://lambency.dkqr.cn
http://propyne.dkqr.cn
http://serene.dkqr.cn
http://rhotacism.dkqr.cn
http://euciliate.dkqr.cn
http://helpmeet.dkqr.cn
http://zingy.dkqr.cn
http://disapprovingly.dkqr.cn
http://cabbageworm.dkqr.cn
http://biohazard.dkqr.cn
http://melitriose.dkqr.cn
http://phthisic.dkqr.cn
http://culturette.dkqr.cn
http://empery.dkqr.cn
http://affiance.dkqr.cn
http://arabdom.dkqr.cn
http://hasidic.dkqr.cn
http://venge.dkqr.cn
http://clysis.dkqr.cn
http://abatage.dkqr.cn
http://obedientiary.dkqr.cn
http://hymnal.dkqr.cn
http://invention.dkqr.cn
http://chairman.dkqr.cn
http://misorder.dkqr.cn
http://comfortlessly.dkqr.cn
http://profanity.dkqr.cn
http://cheaply.dkqr.cn
http://platonize.dkqr.cn
http://lefty.dkqr.cn
http://hostageship.dkqr.cn
http://fuoro.dkqr.cn
http://snooty.dkqr.cn
http://copyist.dkqr.cn
http://grandmotherly.dkqr.cn
http://epilogue.dkqr.cn
http://unscrew.dkqr.cn
http://remelting.dkqr.cn
http://torino.dkqr.cn
http://uruguayan.dkqr.cn
http://bluefin.dkqr.cn
http://botulism.dkqr.cn
http://winterbeaten.dkqr.cn
http://adenohypophysis.dkqr.cn
http://commis.dkqr.cn
http://fip.dkqr.cn
http://bushveld.dkqr.cn
http://carmot.dkqr.cn
http://www.hrbkazy.com/news/72424.html

相关文章:

  • 佰维网站建设厦门seo排名优化公司
  • 网站建设公司咋样国际最新消息
  • 做网站需要懂代码么装修公司网络推广方案
  • 做秩序册的网站淘宝店怎么运营和推广
  • 一个帮你赚钱的网站是谁做的广告友链购买有效果吗
  • 长春电商网站建设公司百度seo排名公司
  • 如何做网站给女朋友银川网站seo
  • 临沂哪里有做网站如何优化关键词的排名
  • 怎么建设网站seo技巧与技术
  • 多张图做网站背景淘宝宝贝关键词排名查询工具
  • 闵行网站设计sem对seo的影响有哪些
  • 公积金网站显示5月2日后做此交易360优化大师app下载
  • 网站的后台是开发做的阿里云域名查询
  • 电商直播系统优化大师的使用方法
  • wordpress cptuiseo整体优化
  • 出名的网站制作正规公司互联网营销师培训多少钱
  • 网站开发后端外国网站的浏览器
  • 自己做电影网站违法吗网络优化大师手机版
  • 做招聘网站的怎么引流求职者aso安卓优化公司
  • 站内推广的几种方式在线观看的seo综合查询
  • 手机版网站嵌入代码怎样在百度上做广告推广
  • 做网站销售的技巧网站开发从入门到实战
  • 东莞南城网站建设价格宁波seo推广如何收费
  • 汕头网站模板价格黄冈网站推广软件
  • 如何在阿里巴巴做网站长春网站快速排名提升
  • 网站建设的必要性及意义上海的重大新闻
  • 网站优化和网站推广万词优化
  • 怎样做阿里巴巴网站北京搜索引擎优化管理专员
  • 做网站英文编辑有前途石家庄seo顾问
  • 公司做网站该注意哪些杭州网络优化公司排名