找迷宫最短路径

深度优先搜索

典型问题:找迷宫最短路径

一,不输入迷宫的数据 

#include
//因为有很多变量全局都要使用,所以采用定义全局变量
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(stepm||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

二,要输入迷宫数据

其实和上面差不多

就是主函数内多一个嵌套循环来输入

#include
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(stepn||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;

这样才能搞出正确的答案

你可能感兴趣的:(C语言算法,深度优先,算法)