NYOJ 最少步數( 迷宮)

2021-07-30 04:39:19 字數 1698 閱讀 4055

描述

這有乙個迷宮,有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 < n <=100),表示有n組測試資料;

隨後n行,每行有四個整數a,b,c,d(0<=a,b,c,d<=8)分別表示起點的行、列,終點的行、列。

輸出

輸出最少走幾步。

樣例輸入:

2 3 1 5 7

3 1 6 7

樣例輸出:

12 11

分析

這個題目就是很尋常的bfs求最短路徑問題。起點和終點用兩個結點表示。

注意需要用vis儲存已經走過的點的最短路徑,如果不這樣就會導致超時。

#include

#include

#include

using

namespace

std;

struct node

};const

int a[9][9]=, ,

, ,, ,

, ,};//迷宮

int dir[4][2]=,,,};

int vis[9][9];

node begin,end; //起點和終點

int bfs()

for(int i=0;i<4;i++)

if(!vis[x][y]&&!a[x][y])

}

}}int main()

return

0;}

後來通過別人的思想發現此題也可以使用dfs來解決。

思想是通過dfs從起點到達終點,走過的步數取最小。

#include

#include

#include

using

namespace

std;

const

intmap[9][9]=, ,

, ,, ,

, ,};//迷宮

int x1,y1,x2,y2;

int dir[4][2] = ,,,};

int vis[9][9]=;

int min = 99999;

void dfs(int x,int y,int step)

}for(int k = 0; k < 4; k++)

}return;

}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,...