⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mazepath.cpp

📁 本程序实现某一已知迷宫的路径搜索
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#define M  6  //迷宫的行数
#define N  6  //迷宫的列数
//0--通道;1--墙;2--入口;3--出口。                              图3.4 迷宫
int maze[M][N] = { 1,2,1,1,1,1,  1,0,1,0,0,1,  1,0,0,0,0,1,
				1,1,0,0,1,1,  1,0,1,0,0,1,  1,1,1,1,3,1 };
typedef struct list{//定义链表结构 ,利用双向链作为栈
	int m,  n;//行、列号表示位置
	struct list *next;  //指向下一个节点
	struct list *back;  //指向前一个节点
}node,*pointer;  //定义节点  //定义动态指针
bool  pass[M][N];  //记录迷宫中各个位置是否走过
int m,n;//  m,n代表当前位置
pointer ptr,preptr,first;  //动态指针,分别代表目前结点、上一个结点与第一个结点

void Start()  //搜寻入口
{
    int i,j;
	for(i=0;i<M-1;i++){
		for(j=0;j<N-1;j++)
			if(maze[i][j]==2)  break;
		if(maze[i][j]==2)  break;
	}
	m = i;  n = j;
	ptr = (pointer)malloc(sizeof(node));
	ptr->m = m;  ptr->n = n;
	ptr->next = NULL;  ptr->back = NULL;
	first = ptr;
}
void  Search ()  //搜寻出口
{
do{
	if(maze[m+1][n]==1 || pass[m+1][n])    //下一格是墙或下一格走过
		if(maze[m][n+1] == 1 || pass[m][n+1])     //右一格是墙或右一格走过
			if(maze[m][n-1] ==1 || pass[m][n-1])   //左一格是墙或左一格走过
				if(maze[m-1][n] == 1 || pass[m-1][n])   //上一格是墙或上一格走过
				{
					if(ptr->back != NULL){
						ptr = ptr->back;  free(ptr->next);  ptr->next = NULL;
					}
					m = ptr->m;  n = ptr->n;
				}
				else {
						m-=1;    //往上一格
						ptr->next = (pointer)malloc(sizeof(node));
						ptr->next->m = m;  ptr->next->n = n;
						preptr = ptr;  ptr->next->next = NULL;
						pass[m][n] = true;  ptr = ptr->next;  ptr->back = preptr;
					}
			else
			{
				n-=1;    //往左一格
				ptr->next = (pointer)malloc(sizeof(node));
				ptr->next->m = m;  ptr->next->n = n;
				preptr = ptr;  ptr->next->next = NULL;
				pass[m][n] = true;  ptr = ptr->next;  ptr->back = preptr;
			}
	    else
		{
			n+=1;    //往右一格
			ptr->next = (pointer)malloc(sizeof(node));
			ptr->next->m = m;  ptr->next->n = n;
			preptr = ptr;  ptr->next->next = NULL;
			pass[m][n] = true;  ptr = ptr->next;  ptr->back = preptr;
		}
	else
	{
		m+=1;    //往下一格
		ptr->next = (pointer)malloc(sizeof(node));
		ptr->next->m = m;  ptr->next->n = n;
		preptr = ptr;  ptr->next->next = NULL;
		pass[m][n] = true;  ptr = ptr->next;  ptr->back = preptr;
	}
}while((maze[m][n] != 3) && (ptr->back != NULL)); 
if(ptr->back == NULL)
	printf("%s\n","找不到迷宫出口,无出口!");
if(maze[m][n] == 3)
	printf("%s%d,%d\n","找到迷宫出口--",m,n);
pointer p=first;
while(p){//输出路径
		printf("%d, %d\n",p->m,p->n);
		p=p->next;
	}
}
void main(){
Start();
Search();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -