精简一下:
#include <bits/stdc++.h>
using namespace std;
int q[51][2], front, rear;
int prv[5][10][2], dist[5][10];
void print(int a, int b) {
if (a == 0 && b == 0) {
printf("%d %d\n", a, b);
return;
}
print(prv[a][b][0], prv[a][b][1]);
printf("%d %d\n", a, b);
}
signed main() {
memset(dist, -1, sizeof(dist));
dist[0][0] = 0;
q[rear++][0] = 0; q[rear][1] = 0;
while (front < rear) {
int a = q[front][0], b = q[front++][1];
int actions[4][2] = {{4, b}, {a, 9}, {a, 0}, {0, b}};
for (auto &act : actions) {
if (dist[act[0]][act[1]] == -1) {
dist[act[0]][act[1]] = dist[a][b] + 1;
prv[act[0]][act[1]][0] = a;
prv[act[0]][act[1]][1] = b;
q[rear][0] = act[0];
q[rear++][1] = act[1];
}
}
int dt = min(a, 9 - b);
if (dist[a - dt][b + dt] == -1) {
update_state(a, b, a - dt, b + dt);
}
dt = min(4 - a, b);
if (dist[a + dt][b - dt] == -1) {
update_state(a, b, a + dt, b - dt);
}
}
print(4, 6);
return 0;
}
void update_state(int a, int b, int na, int nb) {
dist[na][nb] = dist[a][b] + 1;
prv[na][nb][0] = a;
prv[na][nb][1] = b;
q[rear][0] = na;
q[rear++][1] = nb;
}
|