本題為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...