问题描述
X 星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从 A 区到 B 区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了 A,B 区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
坦克车只能水平或垂直方向上移动到相邻的区。
输入格式
输入第一行是一个整数 n,表示方阵的大小, 4 ≤ n < 100
接下来是 n 行,每行有 n 个数据,可能是 A,B,+,- 中的某一个,中间用空格分开。(A,B 都只出现一次)
输出格式
要求输出一个整数,表示坦克从 A 区到 B 区的最少移动步数。
如果没有方案,则输出 -1
样例输入
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
样例输出
10
题解
DFS:
#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;
}