#include <bits/stdc++.h>
using namespace std;
int w[20][20], visval[20][20], viscal[20][20];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
struct Nod{
int x, y, val, cal;
Nod(int x_, int y_, int val_, int cal_) {
x = x_;
y = y_;
val = val_;
cal = cal_;
}
};
int main() {
memset(viscal, 127, sizeof(viscal));
int n, m;
cin >> n >> m;
int begin_x, begin_y, ans = 2000000000;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> w[i][j];
if (w[i][j] == 2) {
begin_x = i;
begin_y = j;
}
}
}
queue<Nod> q;
q.push(Nod(begin_x, begin_y, 6, 0));
while (!q.empty()) {
Nod ___ = q.front(); q.pop();
auto x = ___.x, y = ___.y, val = ___.val, cal = ___.cal;
if (x < 1 || x > n || y < 1 || y > m) continue;
if (val == 0) continue;
if (w[x][y] == 0) continue;
if (w[x][y] == 3) {
ans = min(cal, ans);
continue;
}
if (w[x][y] == 4) {
val = 6;
}
if (cal >= viscal[x][y] && val <= visval[x][y]) continue;
viscal[x][y] = cal;
visval[x][y] = val;
for (int k = 0; k < 3; k++) {
int new_x = x + dx[k], new_y = y + dy[k];
q.push(Nod(new_x, new_y, val-1, cal+1));
}
}
if (ans != 2000000000) cout << ans << endl;
else cout << -1 << endl;
return 0;
}
WA on #10 #12
#10数据:
8 4
3 1 1 1
1 1 1 0
1 1 1 1
0 1 1 2
1 4 4 1
1 4 0 1
1 0 1 1
1 0 1 1
应该输出 4,我的代码报告无解(输出 −1)。