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