題目原意:
小哼去解救小哈愕难,地圖為矩陣,上面有許多障礙物。求解救小哈的最短路徑猫缭。
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;
}