求助为何RE
查看原帖
求助为何RE
25180
DaiBM1楼主2021/6/29 15:51
#include <iostream>
#include <cstdio>
using namespace std;
const int k[8] = { 5040,720,120,24,6,2,1,1 };
                 //0    1   2   3  4 5 6 7
int b[8];
int p[41000];

struct st {
	int a[8];
	int step, f;
	char ch;
}m[41000];

void bfs();

void print(int h)
{
	int n = 0;
	for (int i = h; i != 0; i = m[i].f)  p[n++] = i;
	for (int i = n - 1; i >= 0; --i) cout << m[p[i]].ch;
}

int turn(st d)//康托展开
{
	int s = 0, s2 = 0;
	for (int i = 0; i < 8; ++i)
	{
		for (int j = 0; j < i; ++j)
			if (d.a[j] < d.a[i]) ++s2;
		s += (d.a[i] - s2) * k[i];
	}
	return s;
}

int main()
{
	for (int i = 0; i < 8; ++i) cin >> b[i];
	for (int i = 0; i < 8; ++i) m[0].a[i] = i + 1;
	m[0].step = 0; m[0].f = -1;

	bfs();
	return 0;
}

st change(st q, int f)
{
	if (f == 1)
	{
		for (int i = 0; i <= 3; ++i) swap(q.a[i], q.a[7 - i]);
		q.ch = 'A';
	}
	if (f == 2)
	{
		for (int i = 2; i >= 0; --i)
			swap(q.a[i], q.a[i + 1]),
			swap(q.a[7 - i], q.a[6 - i]);
		q.ch = 'B';
	}
	if (f == 3)
	{
		swap(q.a[1], q.a[6]);
		swap(q.a[6], q.a[5]);
		swap(q.a[5], q.a[2]);
		q.ch = 'C';
	}
	++q.step;
	return q;
}

bool vis[41000];
int head, tail;

void bfs()
{
	vis[0] = true;
	head = -1, tail = 0;
	while (head < tail)
	{
		++head;
		st k;
		for (int i = 1; i <= 3; ++i)
		{
			k = change(m[head], i);
			int g = turn(k);
			if (!vis[g])
			{
				vis[g] = true;
				++tail;
				m[tail] = k;
				m[tail].f = head;
			}
		}
		bool flag = true;
		for (int i = 0; i < 8; ++i)
			if (m[head].a[i] != b[i])
			{
				flag = false;
				break;
			}
		if (flag) {
			cout << m[head].step << endl;
			print(head);
			break;
		}
	}
}
2021/6/29 15:51
加载中...