// UVa 10067 - Playing with Wheels
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct config {
int a, b, c, d;
int m;
};
int sol;
queue<config> q;
config t;
bool T[10][10][10][10];
bool operator ==(config x, config y) {
return x.a == y.a && x.b == y.b && x.c == y.c && x.d == y.d;
}
bool move(int a, int b, int c, int d, int m) {
if (!T[(a + 1) % 10][b][c][d]) {
config conf = { (a + 1) % 10, b, c, d, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[a][(b + 1) % 10][c][d]) {
config conf = { a, (b + 1) % 10, c, d, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[a][b][(c + 1) % 10][d]) {
config conf = { a, b, (c + 1) % 10, d, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[a][b][c][(d + 1) % 10]) {
config conf = { a, b, c, (d + 1) % 10, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[(a + 9) % 10][b][c][d]) {
config conf = { (a + 9) % 10, b, c, d, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[a][(b + 9) % 10][c][d]) {
config conf = { a, (b + 9) % 10, c, d, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[a][b][(c + 9) % 10][d]) {
config conf = { a, b, (c + 9) % 10, d, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
if (!T[a][b][c][(d + 9) % 10]) {
config conf = { a, b, c, (d + 9) % 10, m + 1 };
q.push(conf);
T[conf.a][conf.b][conf.c][conf.d] = true;
if (conf == t) {
sol = conf.m;
return true;
}
}
return false;
}
int main() {
int tt;
for (cin >> tt; tt; tt--) {
config s;
cin >> s.a >> s.b >> s.c >> s.d;
cin >> t.a >> t.b >> t.c >> t.d;
int n;
memset(T, false, sizeof(T));
cin >> n;
for (int i = 0; i < n; i++) {
config f;
cin >> f.a >> f.b >> f.c >> f.d;
T[f.a][f.b][f.c][f.d] = true;
}
if (s == t)
cout << 0 << endl;
else {
sol = -1;
while (!q.empty())
q.pop();
s.m = 0;
q.push(s);
T[s.a][s.b][s.c][s.d] = true;
while (!q.empty()) {
config now = q.front();
q.pop();
if (move(now.a, now.b, now.c, now.d, now.m))
break;
}
cout << sol << endl;
}
}
return 0;
}
Sunday, June 14, 2015
UVa 10067 - Playing with Wheels
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment