nyoj 最少步數

2021-07-30 13:52:34 字數 1687 閱讀 6067

時間限制:

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

輸出輸出最少走幾步。

樣例輸入

2

3 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...