skfjh

 

dfs

假设走一个迷宫,我们要找从起点到终点的最短位置

所以我们就需要尝试每一种可能,先沿着一条路从起点出发开始

没到一个地点我们就对这个地点标记,然后继续走,直到走不通。

我们就开始返回,并且取消标记

我们用dfs()函数解决这个问题

首先我能想象迷宫是一个坐标

此处我们需要2个参数来解决这个问题,即起点。

我们还需要两个数组,一个用来存图,一个标记走过的路避免重复

 

#include<stdio.h>
int m,n,sx,sy,fx,fy,ans;
int a[50][50],v[50][50];//表示地图和对走过的点的标记 
//方向数组 
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y)
{
    //是否到达终点 
    if(x==fx&&y==fy)
    {
        ans++;
        return;
    }
    //遍历四种走法 
    for(int k=0;k<=3;k++)
    {
        int tx,ty;
        tx=x+dx[k];
        ty=y+dy[k];
        //是否越界,是否有障碍物,是否走过 
        if(a[tx][ty]==0&&v[tx][ty]==0&&tx>=0&&tx<=n&&ty>=0&&ty<=m)
        {
            v[tx][ty]=1;
            dfs(tx,ty);
            v[tx][ty]=0;
        }
    }
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%d",&a[i][j]);
        } 
    } 
        scanf("%d %d %d %d",&sx,&sy,&fx,&fy); 
        v[sx][sy]=1;//标记起点已走过 
    dfs(sx,sy);
    printf("%d",ans);
    return 0;
}

 

posted on 2021-01-20 21:09  skfjh  阅读(73)  评论(0编辑  收藏  举报

导航