LinuxC/C++编程基础(11) 基于深度优先搜索查找迷宫路线

一.问题描述:定义一个二维数组,如下:

int maze[MAX_ROW][MAX_COL] = {
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
};

它表示一个迷宫,其中1表示墙壁,0表示可走的路,只能横着走,或者竖着走,不能斜着走。

要求(1):输出从左上角到右下角的一条路线

(2)输出从左上角到右下角的所有路线

转载请注明出处:山水间博客:http://blog.csdn.net/linyanwen99/article/details/8235223

二.要求(1)的实现如下,代码简洁明了,无需赘述:

#include <stdio.h>
#define MAX_ROW 5
#define MAX_COL 5
struct point{
int row;
int col;
}stack[512];
int top = 0;
void push(struct point p){
stack[top] = p;
top++;
}
struct point pop(){
top--;
return stack[top];
}
bool isEmpty(){
return top == 0;
}
int maze[MAX_ROW][MAX_COL] = {
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 printMaze(){
for(int i=0;i<MAX_ROW;++i){
for(int j=0;j<MAX_COL;++j){
printf("%d ",maze[i][j]);
}
printf("\n");
}
printf("*********\n");
}
/**

*这里需要定义一个二维的前驱数组,并都初始化为-1,用于表示访问过的节点,这里略去

*/
void visit(int row,int col,struct point pre){
struct point visitPoint = {row,col};
maze[row][col] = 2;
predecessor[row][col] = pre;//predecessor即前驱数组,如上说明
push(visitPoint);
}
int main(int argc,char** argv){
struct point p = {0,0};
struct point pp = {0,0};
maze[p.row][p.col] = 2;
push(p);
while(!isEmpty()){
p = pop();
if(p.row == MAX_ROW-1 && p.col == MAX_COL-1){
if(!isEmpty()){
printf("stack is not empty\n");
pp = pop();
printf("now the data is %d,%d\n",pp.row,pp.col);
}
break;
}
if(p.col+1 < MAX_COL && maze[p.row][p.col+1] == 0){
// printf("right\n");
visit(p.row,p.col+1,p);
}
if(p.row+1 < MAX_ROW && maze[p.row+1][p.col] == 0){
// printf("up\n");
visit(p.row+1,p.col,p);
}
if(p.col-1 >= 0 && maze[p.row][p.col-1] == 0){
// printf("left\n");
visit(p.row,p.col-1,p);
}
if(p.row-1 >= 0 && maze[p.row-1][p.col] == 0){
// printf("down\n");
visit(p.row-1,p.col,p);
}
printMaze();
}
if(p.row == MAX_ROW-1 && p.col == MAX_COL-1){
printf("(%d,%d)\n",p.row,p.col);
while(predecessor[p.row][p.col].row != -1){
p = predecessor[p.row][p.col];
printf("(%d,%d)\n",p.row,p.col);
}
}else{
printf("no path\n");
}
return 0;
}


三.要求(2)中需要输出所有的路线,只需在前面的基础上稍微改造,即可实现,这里略去。


参考文献:宋劲彬,linux C编程一站式学习

转载请注明出处:山水间博客:http://blog.csdn.net/linyanwen99/article/details/8235223

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值