问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样将迷宫求解的栈替换成队列?

发布网友 发布时间:2022-04-26 10:13

我来回答

1个回答

热心网友 时间:2022-06-27 05:48

队列的先进先出实现了广度优先搜索。并且,在这个问题中,广度优先搜索和前两种方法相比的优势在于:
一,如果迷宫问题的解不止一个,那么广度优先搜索一定能够找到最短路径的解。因为,广度优先搜索的先进先出的特点,说明,它必定是先考虑了和目标点距离为1的所有候选点能否构成到达目标点的通路之后,再考虑和目标点距离为2的所有候选点能否构成到达目标点的通路,再考虑和目标点距离为3的所有点能否构成到达目标点的通路,以此类推,直到走到目标点位置。
二,广度优先搜索使用了队列,队列的head和tail指向的空间被放置了数据之后,就不会继续放数据了,所以这个空间的使用次数只有一次。这个和第一种方法中的栈不同,栈的top不停地push和pop,所以top所在的空间的使用次数可以为多次。队列的空间使用效率低于栈,这个trade-off的好处是,栈中用来记录探索通路的历史路径信息的predecessor数组的空间可以省下来。具体代码如下:

//队列版迷宫问题
struct point{int row, col,predecessor;} queue[512];
int head = 0, tail = 0;
int MAX_ROW=5,MAX_COL=5;

int maze[5][5] = {
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};

void enqueue(struct point p)
{
queue[tail++] = p;
return;
}

struct point dequeque()
{
return queue[head++];
}

int is_empty()
{
return head == tail;
}

void print_maze()
{
int i,j;
for(i=0;i<MAX_ROW;i++)
{
for(j=0;j<MAX_COL;j++)
printf("%d",maze[i][j]);
putchar('\n');
}
printf("**********\n");
}

void visit (int row, int col)
{
struct point visit_point = {row, col,head-1};
maze[row][col] = 2;
enqueue(visit_point);
}

int main()
{
struct point p = {0,0,-1};
int MAX_ROW = 5;
int MAX_COL = 5;
maze[p.row][p.col] = 2;
enqueue(p);
while(!is_empty()) {
p = dequeque();
if(p.row == MAX_ROW -1 && p.col == MAX_COL -1)
break;
if(p.col+1< MAX_COL && maze[p.row][p.col+1] == 0)
visit(p.row,p.col+1);
if(p.row+1< MAX_ROW && maze[p.row+1][p.col] == 0)
visit(p.row+1,p.col);
if(p.col-1>=0 && maze[p.row][p.col-1] == 0)
visit(p.row,p.col-1);
if(p.row-1>=0 && maze[p.row-1][p.col] == 0)
visit(p.row-1,p.col);
// print_maze();
}
if(p.row == MAX_ROW -1 && p.col == MAX_COL -1) {
printf("(%d,%d)\n",p.row,p.col);
while(p.predecessor!= -1) {
p = queue[p.predecessor];
printf("(%d,%d)\n",p.row,p.col);
}
} else {
printf("No Path\n");
}
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
青松代表什么意思 ...正反面和本人照片能干什么? 注:本人照片不是手持身份证照片... 2024年建议买的5款指尖陀螺(建议收藏) 举起手来60词英语作文 ...年后的再一次发掘,引起国内外媒体的关注。病句... 油性皮肤选购粉饼时需要注意些什么? 油皮适合用什么粉饼? 十大油皮最好用粉饼 excel怎么删除重复数据Excel教你四招快速删除重复数据 奶酪的制作原理是什么? Java代码的执行顺序是怎么样的呢? 汽车在启动的时候会有电流声,滋滋的,在车内听不到 汽车的发电机有滋滋响的声音是怎么回事? 踏板摩托车电启动时有和电流声一样的滋滋声,声音很小,是怎么回事啊 汽车开启大灯后有滋滋电流声 速腾自动挡1.6接通电源后变速箱插头滋滋的电流声,启动车后就没有啦 宝马x1怎么通电不启动有滋滋的电流声? 车有滋滋的电流声,驾驶室里,怎么回事? 速腾车通电进气格栅和中控有蜂鸣的电流声 车辆通电后,发动机仓传来滋滋电流声是怎么回 新买的汽车发动机有滋滋电流声什么原因 汽车不能打火有滋滋的电流声音是什么造成的呢 打开电源后车外部有滋滋的声音 车辆通电后,发动机仓传来滋滋电流声是怎么回事 汽车里有滋滋的电流声是怎么回事 为什么我的车一通电就有电流声 车子通电后有吱吱响的电流声 我的车电流吱吱响是怎么回事啊 如何将旧手机所有资料导入新手机小米? 小米盒子3如何绑定百度网盘 数据结构的课程设计!!如何把这里的栈结构用链队列替换? C语言删除栈中重复元素,用数组实现,不用指针 怎么输出栈的内容,并且栈里的内容不变,就是栈里仍和输出之前一样 windows 7中内存保护机制不包括哪项技术? 菜鸟:刚学java,堆区,栈区,静态区,代码区,晕了!!! 栈是遵循先进后出原则,那指针是用来干嘛的? 用C语言怎么写输出栈中元素,并打印栈中元素 如果用一个栈代替9.2节中的拓扑排序的算法,是否得到不同的排序?为什么... 石家庄幕墙设计哪家最专业?地址是什么? unix变成中exec的问题 深圳玻璃幕墙承包公司哪家比较好? 数据结构 关于栈top指针位置问题 幕墙公司排名,幕墙设计公司哪家好? Android中,FragmentTransaction类的replace()方法的作用是什么? 建筑幕墙设计做得最好的公司? 谁给我解释下,什么是在栈上分配内存,与在堆上分配内存 成都幕墙设计公司推荐 C语言求指导 请问幕墙设计公司哪家好 .equals的问题