蓝桥杯 穿越雷区(bfs)

时间:2023-03-09 19:50:40
蓝桥杯 穿越雷区(bfs)
题目描述
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。

输入
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
输出
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
样例输入
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
样例输出
10

 #include<iostream>
#include<queue> using namespace std; struct node
{
char ch; // 该坐标处的字符
int x, y; // 在地图上的坐标
int step; // 步数(层数)
}nod; char mp[][];
int vis[][];
int dx[] = {,-,,};
int dy[] = {,,,-};
int n;
int start_x, start_y;
int flag = ; void bfs(int x, int y)
{
vis[x][y] = ;
queue<node>Q;
nod.step = ;
nod.x = x;
nod.y = y;
nod.ch = 'A';
Q.push(nod); node t, p;
while(!Q.empty())
{
t = Q.front();
Q.pop(); if(t.ch == 'B')
{
flag = ;
cout << t.step << endl;
return;
} for(int i = ; i < ; ++i)
{
int xx = t.x + dx[i];
int yy = t.y + dy[i]; if(xx >= && yy >= && xx < n && yy < n && !vis[xx][yy] && mp[xx][yy] != t.ch) // 这一层的字符不能和前一层的一样,否则坦克会报废
{
p.ch = mp[xx][yy];
p.x = xx;
p.y = yy;
p.step = t.step + ;
Q.push(p);
}
} } cout << - << endl; // 队列已经空了仍然没有找到方案,则输出-1 } int main()
{
cin >> n;
for(int i = ; i < n; ++i)
for(int j = ; j < n; ++j)
{
cin >> mp[i][j];
if(mp[i][j] == 'A')
{
start_x = i;
start_y = j;
}
} bfs(start_x, start_y); return ;
}