介是蒟蒻的代码,求调 QvQ
#include <bits/stdc++.h>
#define il inline
using namespace std;
int mb[10];
struct node
{
int a[10];
int fa, s;
char c;
} q[50000];
bool v[50000];
void print(int x)
{
if(x == 1) return;
print(q[x].fa);
cout << q[x].c;
}
bool check(node x)
{
for(int i = 1; i <= 8; i++)
if(x.a[i] != mb[i]) return 0;
return 1;
}
il int jc(int x)
{
if(x == 0) return 0;
if(x == 1) return 1;
return x * jc(x - 1);
}
il int turn(node x)
{
int res = 0;
for(int i = 1; i <= 8; i++)
{
int s = 0;
for(int j = i + 1; j <= 8; j++)
if(x.a[i] > x.a[j]) s++;
res += s * jc(8 - i);
}
return res;
}
il void swapp(int &a, int &b){int x = a; a = b; b = x;}
//--------------------------------
il node A(node);il node B(node);il node C(node);
int main()
{
int x = 0;
for(int i = 1; i <= 8; i++) cin >> mb[i];
int tl = 1, he = 0;
for(int i = 0; i <= 8; i++) q[tl].a[i] = i;
q[1].s = 0;
q[1].fa = 0;
do
{
he++;
node x = q[he];
if(check(x))
{
cout << x.s << "\n";
// for(int i = 1; i <= tl; i++)
// cout << q[i].fa << " " << q[i].s << endl;
print(he);
return 0;
}
node x1 = A(x);
node x2 = B(x);
node x3 = C(x);
if(!v[turn(x1)])
{
q[tl] = x1;
v[turn(x1)] = 1;
q[tl].s++, q[tl].c = 'A', q[tl].fa = he; tl++;
}
if(!v[turn(x2)])
{
q[tl] = x2;
v[turn(x2)] = 1;
q[tl].s++, q[tl].c = 'B', q[tl].fa = he; tl++;
}
if(!v[turn(x3)])
{
q[tl] = x3;
v[turn(x3)] = 1;
q[tl].s++, q[tl].c = 'C', q[tl].fa = he; tl++;
}
}while(he < tl);
return 0;
}
//--------------------------------
il node A(node x)
{
for(int i = 1; i <= 4; i++)
swapp(x.a[i], x.a[9 - i]);
return x;
}
il node B(node x)
{
for(int i = 4; i >= 2; i--)
{
swapp(x.a[i], x.a[i - 1]);
swapp(x.a[10 - i], x.a[9 - i]);
}
return x;
}
il node C(node x)
{
swapp(x.a[2], x.a[3]);
swapp(x.a[7], x.a[6]);
swapp(x.a[6], x.a[2]);
return x;
}
案发现场
