深度优先搜索
典型问题:找迷宫最短路径
一,不输入迷宫的数据
#include<stdio.h>
//因为有很多变量全局都要使用,所以采用定义全局变量
int n,m,p,q,sx,sy,min=9999999,t,i;//这是迷宫的长和宽,想要到达的终点坐标和起点坐标。t为障碍的个数
//这个min之所以要大一点,是因为他要装最短路径,不能赋0为初值。
int next[4][2]={{1,0},{0,-1},{-1,0},{0,1}};//这个是等会移动时要加的值,依次表示向右上左下移动
int a[1000][1000]={0};//这个表示迷宫,0表示无障碍,1表示有障碍。
int v[1000][1000]={0};//这个表示有无访问过这个格子,0表示已访问,1表示未访问。
int T[1000][2]={0};//装障碍的地址。
//核心代码
void dfs(int x,int y,int step)
{
int tx,ty,i;
//下面的if判断是判断有无到达终点,至于为什么在开头等会就知道了
if(x==p&&y==q)
{
if(step<min)
{
min=step;
}
return;
}
//用一个循环来分别实现右下上左的移动
for(i=0;i<4;i++)
{
//用tx,ty来装移动后的位置
tx=x+next[i][0];
ty=y+next[i][1];
//判断所到达格子是否越界(也就是不在n*m的范围里),********不能忘了这行****************
if(tx<1||tx>m||ty<1||ty>n)
{
continue;
}
//判断所移动到的格子是否被访问过和是否有障碍,如果都有就用dfs进行下次移动
if(a[tx][ty]==0&&v[tx][ty]==0)
{
//将v中的这个格子赋值为1,表示已访问
v[tx][ty]=1;
dfs(tx,ty,step+1);
//防止影响其他路线的行走,再赋值回0,相当于 v[tx][ty]=1;只在上行的dfs中起作用
v[tx][ty]=0;
}
}
//所有情况判断完了,就return。
return;
}
int main (void)
{
//输入迷宫的长和宽和障碍的数目。
scanf("%d%d%d",&n,&m,&t);
//输入迷宫的起点和终点
scanf("%d%d%d%d",&sx,&sy,&p,&q);
//输入障碍的坐标
for(i=0;i<t;i++)
{
scanf("%d%d",&T[i][0],&T[i][1]);
}
//将数据转进迷宫中
for(i=0;i<t;i++)
{
a[T[i][0]][T[i][1]]=1;
}
//深度搜索模式,启动!!!
dfs(sx,sy,0);
//输出结果
printf("%d",min);
return 0;
}
二,要输入迷宫数据
其实和上面差不多
就是主函数内多一个嵌套循环来输入
#include<stdio.h>
int n,m,p,q,min=999999999;
int next[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
int a[1000][1000]={0};
int v[1000][1000]={0};
void dfs(int x,int y,int step)
{
int tx,ty,i;
if(x==p&&y==q)
{
if(step<min)
{
min=step;
}
}
for(i=0;i<4;i++)
{
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||tx>n||ty<1||ty>m)
{
continue;
}
if(a[tx][ty]==0&&v[tx][ty]==0)
{
v[tx][ty]=1;
dfs(tx,ty,step+1);
v[tx][ty]=0;
}
return;
}
}
int main (void)
{
int i,k,sx,sy,p,q;
scanf("%d%d",&n,&m);
//不用再装障碍物的位置了,直接在这个嵌套循环中输入了
//而且输入开始不要从0开始,从1开始,非常重要!!!!
for(i=1;i<=n;i++)
{
for(k=1;k<=m;k++)
{
scanf("%d",&a[i][k]);
}
}
scanf("%d%d%d%d",&sx,&sy,&p,&q);
dfs(sx,sy,0);
printf("%d",min);
return 0;
}
PS:如果你想要算出一共有几种行走方案,那就需要把起始点赋值成已走过
也就是
v[sx][sy]=1;
这样才能搞出正确的答案