//UVA1343TheRotationGame
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 30;
int maxd;
int a[MAXN];
char ans[100];
int line[8][7] = {
{22, 20, 15, 11, 6, 2, 0 },
{23, 21, 17, 12, 8, 3, 1 },
{4, 5, 6, 7, 8, 9, 10},
{13, 14, 15, 16,17,18, 19},
};
int rev[8] = {5, 4, 7, 6, 1, 0, 3, 2};
int centre[8] = {6, 7, 8, 12, 17, 16, 15, 11};
bool Is_final() {
int tmp = a[centre[0]];
for(int i = 0; i < 8; i++) if(a[centre[i]] != tmp) return false;
return true;
}
int Diff(int target) {
int cnt = 0;
for(int i = 0; i < 8; i++) if(a[centre[i]] != target) cnt++;
return cnt;
}
int h() {
return min(Diff(1), min(Diff(2), Diff(3)));
}
void Move(int b) {
int tmp = a[line[b][6]];
for(int i = 5; i >= 0; i--) a[line[b][i + 1]] = a[line[b][i]];
a[line[b][0]] = tmp;
}
bool dfs(int d) {
if(Is_final()) {
//printf("ans[d]%c, d = %d\n", ans[d], d);
ans[d] = 0;
return true;
}
if(d + h() > maxd) return false;
for(int i = 0; i < 8; i++) {
ans[d] = i + 'A';
//printf("**%c, d = %d\n", ans[d], d);
int olda[MAXN];
//memcpy(olda, a, sizeof(a));
Move(i);
if(dfs(d + 1)) return true;
Move(rev[i]);//当搜索失败时消去影响
//memcpy(a, olda, sizeof(a));
}
return false;
}
int main() {
for(int i = 4; i <= 7; i++) {
for(int j = 0; j < 7; j++) {
line[i][j] = line[rev[i]][6 - j];
}
}
while(scanf("%d", &a[0]) == 1 && a[0]) {
for(int i = 1; i < 24; i++) scanf("%d", &a[i]);
if(Is_final()) printf("No moves needed\n%d\n", a[centre[0]]);
else {
for(maxd = 1; ; maxd++) {
if(dfs(0)) { printf("%s\n%d\n", ans, a[centre[0]]);/* for(int i = 0; i < 24; i++) printf("%2d", a[i]); printf("\n");*/ break; }
}
}
}
return 0;
}
/*
*/
UVA1343TheRotationGame
最新推荐文章于 2019-02-21 21:20:51 发布