[蓝桥杯2015决赛]穿越雷区
题目描述
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
分析
由题意可知每个单元格之间距离都为1,可知这是一个bfs最短路模型,只是在这之上加了一点限制条件,即坦克战车下一个位置必须与当前所在位置能量特征不同,因此只需要在扩展时加一个判断即可。(不愧是搜索杯)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 110;
int n;
char g[N][N];
int dist[N][N];
bool st[N][N];
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
void bfs(int sx,int sy,int ex,int ey)
{
queue<PII> q;
q.push(make_pair(sx,sy));
dist[sx][sy] = 0;
while(q.size()){
auto t = q.front();
q.pop();
int x = t.first,y = t.second;
for(int i = 0; i < 4; i ++ ){
int xx = x + dx[i],yy = y + dy[i];
if(xx < 1 || xx > n || yy < 1 || yy > n || dist[xx][yy]) continue;
if(g[x][y] == 'A'){
q.push(make_pair(xx,yy));
dist[xx][yy] = dist[x][y] + 1;
}else {
if(g[x][y] != g[xx][yy]){
q.push(make_pair(xx,yy));
dist[xx][yy] = dist[x][y] + 1;
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int sx,sy,ex,ey;
cin >> n;
for(int i = 1; i <= n; i ++ ){
for(int j = 1; j <= n; j ++ ){
cin >> g[i][j];
if(g[i][j] == 'A'){
sx = i, sy = j;
}
if(g[i][j] == 'B'){
ex = i, ey = j;
}
}
}
bfs(sx,sy,ex,ey);
if(dist[ex][ey] == 0) cout << -1 << endl;
else cout << dist[ex][ey] <<endl;
return 0;
}

浙公网安备 33010602011771号