藍橋杯之穿越雷區 BFS

2021-08-17 22:31:50 字數 1552 閱讀 2711

本題為2023年第六屆藍橋杯c語言a組試題,第4題。

考點:廣度優先搜尋(bfs)

廣搜一般用來解決「最短」「最少」問題,需用到佇列。

已知的地圖是乙個方陣,上面用字母標出了a,b區,其它區都標了正號或負號分別表示正負能量輻射區。

例如:

a + - + -

- + - - +

- + + + -

+ - + - +

b + - + -

坦克車只能水平或垂直方向上移動到相鄰的區。

資料格式要求:

輸入第一行是乙個整數n,表示方陣的大小, 4<=n<100

接下來是n行,每行有n個資料,可能是a,b,+,-中的某乙個,中間用空格分開。

a,b都只出現一次。

要求輸出乙個整數,表示坦克從a區到b區的最少移動步數。

如果沒有方案,則輸出-1

例如:

使用者輸入:

5 a + - + -

- + - - +

- + + + -

+ - + - +

b + - + -

則程式應該輸出:

10資源約定:

峰值記憶體消耗 < 512m

cpu消耗 < 1000ms

用二維陣列map[ ][ ]接收「地圖」,注意輸入時有空格隔開,需要過濾掉空格。

之後找到入口,即「a」所在位置,從該點開始廣度優先搜尋。

#include

#include

#include//我們使用stl中的佇列容器

using

namespace

std;

char

map[101][101];

int n;

//以下兩個陣列為坦克走的四個方向

int bx[4]=;

int by[4]=;

//定義結構體,方便廣蒐時入隊、出隊

struct poi;

void bfs(int x,int y);//標記某點是否訪問過

queue

path;//定義佇列path

int row,col,step_n;//三個中間變數,對應結構體的三個變數

poi p1;//起始點'a'

p1.x=x;//起始點橫座標

p1.y=y;//起始點縱座標

p1.step=0;//『a』點的步數肯定是0

path.push(p1);//'a'點入列

vis[x][y]=1;//標記'a'點已訪問

while(!path.empty())}}

}//如果四個方向都走不通,則說明無路可走,輸出-1,直接返回

cout

<<-1

}}int main()

else}}

for(i=0;i//用於找到入口'a',因為a不一定在map[0][0]位置

for(j=0;jif(map[i][j]=='a')

}break;

}return

0;}

藍橋杯 2015決賽 穿越雷區(bfs

x星的坦克戰車很奇怪,它必須交替地穿越正能量輻射區和負能量輻射區才能保持正常運轉,否則將報廢。某坦克需要從a區到b區去 a,b區本身是安全區,沒有正能量或負能量特徵 怎樣走才能路徑最短?已知的地圖是乙個方陣,上面用字母標出了a,b區,其它區都標了正號或負號分別表示正負能量輻射區。例如 坦克車只能水平...

藍橋杯2015決賽 穿越雷區 bfs

題目描述 x星的坦克戰車很奇怪,它必須交替地穿越正能量輻射區和負能量輻射區才能保持正常運轉,否則將報廢。某坦克需要從a區到b區去 a,b區本身是安全區,沒有正能量或負能量特徵 怎樣走才能路徑最短?已知的地圖是乙個方陣,上面用字母標出了a,b區,其它區都標了正號或負號分別表示正負能量輻射區。例如 a ...

藍橋杯2015決賽 穿越雷區 (bfs)

一道題,居然卡在了輸入資料上,我去。搞了半天也不知道怎麼把資料完整的輸進去。這一次漲姿勢了。方向 int vis 105 105 標記是否走過 int n struct node queueq intbfs int x,int y for int i 0 i 4 i return 1 intmain...