深度優(yōu)先搜索

題目原意:

小哼去解救小哈,地圖為矩陣,上面有許多障礙物。求解救小哈的最短路徑。

INPUT
第一行:兩個數(shù)據(jù),行數(shù)n和列數(shù)m,中間用空格隔開
接下來的n行m列:輸入迷宮,0表示空地,1表示障礙物,每一行的每個數(shù)用空格隔開
最后一行:四個數(shù)據(jù),前兩個為迷宮入口的坐標,后兩個為小哈的x和y坐標

#include <cstdio>
int n,m,p,q,min=99999999;
int a[51][51],book[51][51];
void dfs(int x,int y,int step)
{
    int next[4][2]={
        {0,1},//向右走
        {1,0},//向下走
        {0,-1},//向左走
        {-1,0}//向上走
    };
    int tx,ty,k;
    //判斷是否到達小哈的位置
    if(x==p&&y==q)
    {
        //更新最小值
        if(step<min)
            min=step;
        return ;//這里的返回值很重要
    }
    //枚舉四種走法
    for(k=0;k<=3;k++)
    {
        //計算下個點的坐標
        tx=x+next[k][0]; //下個點的橫坐標
        ty=y+next[k][1];//下個點的縱坐標
        /*
         第一輪,k=0,x+0,行的位置不變;    y+1,列的位置向右移一個;總的來說向右移動,對應{0,1}
         第二輪,k=1,x+1,行的位置向下移動; y+0,列的位置不變;     總的來說向下移動,對應{1,0}
         ......
         
         */
        //判斷是否越界
        if(tx<1||tx>n||ty<1||ty>m)
            continue;
        //判斷該點是否為障礙物或者已經(jīng)在路徑中
        if(a[tx][ty]==0&&book[tx][ty]==0)
        {
            book[tx][ty]=1;//標記這個點已經(jīng)走過
            dfs(tx, ty, step+1);//開始嘗試下一個點
            book[tx][ty]=0;//嘗試結束,取消這個點的標記
        }
    }
    return ;
    /*
     總的來說是自身不斷的調用自己
     總是按照next的方向走,
     如果向規(guī)定的第一個方向走,如果沒有到達終點并且沒有碰到墻的話,繼續(xù)走下一個點
     如果這個方向的點碰到墻的話,就返回換規(guī)定的下一個方向走,如果方向都嘗試完都走不通的話,就返回上一個點,直到到達終點
     */
}
/*
 測試數(shù)據(jù):
 5 4
 0 0 1 0
 0 0 0 0
 0 0 1 0
 0 1 0 0
 0 0 0 1
 1 1 4 3
 */
int main()
{
    int i,j,startx,starty;
    //讀入n和m,n為行,m為列
    scanf("%d %d",&n,&m);
    //讀入迷宮
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    //讀入起點和終點坐標
    scanf("%d %d %d %d",&startx,&starty,&p,&q);
    //從起點開始搜索
    book[startx][startx]=1;//標記起點已在路徑中,放置后面重復再走
    //第一個參數(shù)是起點坐標的x坐標,第二個參數(shù)是起點的y坐標,第三個參數(shù)是初始步數(shù)為0
    dfs(startx,starty,0);
    printf("%d",min);
    getchar();getchar();
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容