C++搜索与回溯算法之迷宫问题

迷宫问题:一个迷宫由RC列格子组成,有的格子里有障碍物,不能走,用’#’表示;有的格子是空地,可以走,用’.’表示;。给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。输入R、C和迷宫,输出所有路径。

代码如下:

 

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int r,c;
int num1[101],num2[101],total;   //存储数据
int wayr[4]={0,0,1,-1},wayc[4]={1,-1,0,0}; //进行移动
bool mark[101][101]; //判断该数是否被标记过
char maze[101][101]; //迷宫
bool check(int x,int y) //判断是否出局
{
	if(x<=0||y<=0||x>r||y>c) return false;
	return true;
}
void print()   //输出函数
{
	printf("(1,1)");
	for(int i=1;i<=total;i++)
		printf("->(%d,%d)",num1[i],num2[i]);
	printf("\n");
}
void search(int x,int y)  //搜索函数,用于走迷宫
{
	for(int i=0;i<4;i++)
		if(!mark[x+wayr[i]][y+wayc[i]]&&check(x+wayr[i],y+wayc[i])&&maze[x+wayr[i]][y+wayc[i]]=='.')   //判断
		{
			x+=wayr[i];
			y+=wayc[i];
			total++;
			num1[total]=x;
			num2[total]=y;
			mark[x][y]=true;
			if(x==r&&y==c) print(); //判断并输出
			search(x,y);     //下一轮回溯
			mark[x][y]=false;  //回溯
			total--;
			x-=wayr[i];
			y-=wayc[i];
		}
}
int main()
{
	scanf("%d%d",&r,&c);
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>maze[i][j];
	mark[1][1]=true;  //标记起点
	search(1,1);
	return 0;
}

 

《C++搜索与回溯算法之迷宫问题》

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/C20190413/article/details/72636245
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞