| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 
 | 
 
 
 
 #include <cstdio>
 #include <cstring>
 #include <algorithm>
 #include <queue>
 using namespace std;
 
 typedef long long LL;
 const int maxn = 10;
 const int maxm = 100330;
 const int A[maxn] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
 int len[maxm], fa[maxm];
 char p[maxm], s[maxm];
 bool vis[maxm];
 struct node {
 int a[8], st;
 
 node trans(int t) {
 node k = *this;
 if (t == 0) {
 for (int i = 0; i < 4; ++i) {
 swap(k.a[i], k.a[8 - i - 1]);
 }
 } else if (t == 1) {
 for (int i = 3; i > 0; --i) {
 swap(k.a[i], k.a[i - 1]);
 swap(k.a[8 - i - 1], k.a[8 - i]);
 }
 } else {
 swap(k.a[5], k.a[6]);
 swap(k.a[2], k.a[5]);
 swap(k.a[1], k.a[2]);
 }
 k.cantor();
 return k;
 }
 
 int cantor() {
 st = 0;
 for (int i = 0; i < 8; ++i) {
 int cnt = 0;
 for (int j = i + 1; j < 8; ++j) {
 if (a[i] > a[j]) {
 ++cnt;
 }
 }
 st += cnt * A[7 - i];
 }
 return st;
 }
 } a;
 
 int main() {
 freopen("msquare.in", "r", stdin);
 freopen("msquare.out", "w", stdout);
 for (int i = 0; i < 8; ++i) {
 scanf("%d", &a.a[i]);
 }
 int aim = a.cantor();
 for (int i = 0; i < 8; ++i) {
 a.a[i] = i + 1;
 }
 vis[a.cantor()] = true;
 fa[a.st] = -1, len[a.st] = 0;
 queue<node> q;
 q.push(a);
 while (!q.empty()) {
 node k = q.front();
 q.pop();
 if (k.st == aim) {
 printf("%d\n", len[aim]);
 int cnt = 0;
 while (fa[aim] != -1) {
 s[cnt++] = p[aim];
 aim = fa[aim];
 }
 for (int i = 0; i < cnt; ++i) {
 putchar(s[cnt - i - 1]);
 if (i % 60 == 59) {
 puts("");
 }
 }
 if (cnt == 0 || cnt % 60 != 0) {
 puts("");
 }
 return 0;
 }
 for (int i = 0; i < 3; ++i) {
 node x = k.trans(i);
 if (!vis[x.st]) {
 vis[x.st] = true;
 len[x.st] = len[k.st] + 1;
 fa[x.st] = k.st;
 p[x.st] = i + 'A';
 q.push(x);
 }
 }
 }
 return 0;
 }
 
 |