時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:4 描述
這有乙個迷宮,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示牆。
現在輸入乙個道路的座標作為起點,再如輸入乙個道路的座標作為終點,問最少走幾步才能從起點到達終點?
(注:一步是指從一座標點走到其上下左右相鄰座標點,如:從(3,1)到(4,1)。)
輸入
第一行輸入乙個整數n(0
輸出輸出最少走幾步。
樣例輸入
23 1 5 7
3 1 6 7
樣例輸出
12
思路:可以採用深搜和廣搜兩種方式來寫這個題。用遞迴實現搜尋要注意結束條件:而本題的結束條件即是:搜尋到終點,注意標記已經走過的路,如 果用深搜,一旦走到無路可走,需要取消標記,而廣搜不需要取消標記。
深搜**:
#include//using namespace std;
#define min(x,y) x>y?y:x;//如果x>y則取y值,反之取x
int dir[4][2]=;//控制方向
int map[9][9]=,
, ,
, ,
, ,
, ,
};int c,d,m;
void dfs(int a,int b,int ans)
map[a][b]=1;//標記已經走過的路
for(int i=0;i<4;i++)//按照四個方向搜
} }int main()
return 0;
}
因為bfs是要乙個接乙個的遍歷,所以用到了結構體,來儲存座標和當前所走步數
1.每走一步,通過定義的結構體,從佇列中提取a(即上一步的座標、步數(步數每次累加))
2.在a的基礎上進行對a周圍四個方向進行判斷,找出可以繼續走的位置(即非障礙、邊界),並將該位置的座標,進入佇列中
繼續走下一步時,迴圈以上1.2兩步操作
廣搜**:
#include#include#include//佇列的標頭檔案
#includeusing namespace std;
int s[9][9]=;
int a,b,c,d;
int book[100][100];
int dir[4][2]=;
struct node
;void bfs(int x,int y)
for(int i=0;i<4;i++)}}
}int main()
return 0;
}
NYOJ 最少步數
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述這有乙個迷宮,有0 8行和0 8列 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1...
NYOJ 最少步數
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 這有乙個迷宮,有0 8行和0 8列 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,...
NYOJ 最少步數
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述這有乙個迷宮,有0 8行和0 8列 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1...