测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40866. 穿越雷区

填空题 困难

题目描述

穿越雷区

题目描述

X 星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。

某坦克需要从 A 区到 B 区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

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

例如:

        

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

输入格式

输入第一行是一个整数 n,表示方阵的大小, 4 ≤ n < 100

接下来是 n 行,每行有 n 个数据,可能是 A,B,+,- 中的某一个,中间用空格分开。(A,B 都只出现一次)

输出格式

要求输出一个整数,表示坦克从 A 区到 B 区的最少移动步数。

如果没有方案,则输出 -1

样例输入

5

A + - + -

- + - - +

- + + + -

+ - + - +

B + - + -

1

2

3

4

5

6

样例输出

10

参考答案

#include <iostream> using namespace std; const int N = 110; char g[N][N]; bool vis[N][N]; int x1, y1, x2, y2; int n, ans = 0x3f3f3f3f; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; void dfs(int x, int y, int step) { if(step > ans) return; // 最优性剪枝 if(x == x2 && y == y2) { ans = step; return; } for (int i = 0; i < 4; i ++) { int a = x + dx[i], b = y + dy[i]; if(a < 1 || a > n || b < 1 || b > n || vis[a][b]) continue; if(g[x][y] == '+' && g[a][b] == '+') continue; if(g[x][y] == '-' && g[a][b] == '-') continue; vis[a][b] = true; dfs(a, b, step + 1); vis[a][b] = false; } } int main() { 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') x1 = i, y1 = j; if(g[i][j] == 'B') x2 = i, y2 = j; } vis[x1][y1] = true; dfs(x1, y1, 0); if(ans != 0x3f3f3f3f) cout << ans << endl; else cout << -1 << endl; return 0; }
上一题 下一题