dfs解决迷宫问题(dfs的入门应用)
下面是对应代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int min=9999999;
int c[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; //这里是定义的四个方向,上下左右
int n;
int s[1000][1000]; //一个足够容纳迷宫的二维数组
void dfs(int x,int y,int step) //dfs接受坐标和当前步数
{
int i,xn,yn;
if(x==n-1&&y==n-1) //一定要把结束条件放在前面,先判断是否结束
{ //这里判断是否到达终点
if(step<min) //判断步数是否小于当前最小步数
min=step;
return;
}
for(i=0; i<4; i++) //因为有四个方向可以走,所以这里循环4次,四种情况
{
xn=x+c[i][0]; //这里一定要把走过之后的x,y给一个新的变量(比如这里的xnyn)
yn=y+c[i][1]; //因为要以原来的位置为中心向上下左右分别测试走,所以原来的位置不能改变。
if(xn<0||xn>=n||yn<0||yn>=n) //判断是否出界
{
continue; //如果出界,跳过这一步,进入下一步
}
if(s[xn][yn]==0) //判断是否是能走的路
{
s[xn][yn]=1; //如果能走,把上一步标记为墙以防重复
dfs(xn,yn,step+1); //进入下一步
s[xn][yn]=0; //回溯,回来的时候把之前走过的还变成路
}
}
return;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&s[i][j]);
}
}
dfs(0,0,0);
printf("%d",min); //输出最小步数
}
dfs无法处理没有对应路径的情况,而且在有些情况下时间复杂度很高;
改用bfs能处理这一问题:
int BFS(int start_x, int start_y, int row, int col)
{
Node *head,*tail,*p,*target;
int x,y, step,i,j,xn,yn;
int road;
int visited[row][col];
for(i=0;i<row;i++) //初始化
{
for(j=0;j<col;j++)
{
visited[i][j]=0;
}
}
visited[start_x][start_y]=1;
Queue que;
que.head = NULL;
que.tail = NULL;
que.size = 0;
enQueue(&que,start_x,start_y,0);
while(que.size>0)
{
target = que.head; //出队
x = target->x;
y = target->y;
step = target->step;
que.head = target->next;
que.size -= 1;
free(target);
for(i=0;i<4;i++)
{
xn=x+dir[i][0];
yn=y+dir[i][1];
if(xn<row&&xn>=0&&yn<col&&yn>=0&&visited[xn][yn]==0) //判断是否出界
{
road=maze[xn][yn];
visited[xn][yn]=1;
if(road==0)
{
enQueue(&que,xn,yn,step+1);
}
else
{
if(road==4)
{
return step+1; //最小值就是最先return的那个值,不用进行比较
}
}
}
else
{
continue;
}
}
}
return -1; //当所有路径都无法return step+1的时候 执行return -1,表示无法到达
}