求调,不知怎的0分
查看原帖
求调,不知怎的0分
1218883
yanghb666楼主2025/1/13 10:18
#include <bits/stdc++.h>
using namespace std;
char a[50010];
int g, prt[50010], step[50010], s, l;
bool vis[1000010];
struct node {
	int a[2][4];
}st, lt, q[10010];
int fac(int n) {
	if (n == 1 || n == 0) return 1;
	return n * fac(n - 1);
}
int cantor(node x) {
	int t[8], res = 0;
	for (int i = 0; i <= 3; i ++) t[i] = x.a[0][i], t[7 - i] = x.a[1][3 - i];
	//	for (int i = 0; i <= 7; i ++) cout << t[i] << ' ';
	for (int i = 0; i <= 7; i ++) {
		int dayu = 0;
		for (int j = i + 1; j <= 7; j ++) {
			if (t[j] < t[i]) dayu++;
		}
		res += dayu * fac(7 - i);
	}
	return res;
}
node zhuan(char op, int nm) {
	node w;
	if (op == 'A') {			//交换上下两行					★★☆☆☆
		for (int i = 0; i <= 3; i ++) {
			w.a[0][i] = q[nm].a[1][i];
			w.a[1][i] = q[nm].a[0][i];
		}
		/*
		  1 2 3 4			8 7 6 5
		  8 7 6 5 ------->	1 2 3 4
		 */
	}
	if (op == 'B') {			//将最右边的一行插入最左边		★★★☆☆
		w.a[0][0] = q[nm].a[0][3], w.a[1][0] = q[nm].a[1][3];
		for (int i = 1; i <= 3; i ++) {
			w.a[0][i] = q[nm].a[0][i - 1];
			w.a[1][i] = q[nm].a[1][i - 1];
		}
		/*
		  1 2 3 4			4 1 2 3
		  8 7 6 5 ------->  5 8 7 6
		 */
	}
	if (op == 'C') {			//魔板中央作顺时针旋转,硬交换	★★★★★ 
		w.a[0][0] = q[nm].a[0][0];
		w.a[0][1] = q[nm].a[1][1];
		w.a[0][2] = q[nm].a[0][1];
		w.a[0][3] = q[nm].a[0][3];
		w.a[1][0] = q[nm].a[1][0];
		w.a[1][1] = q[nm].a[1][2];
		w.a[1][2] = q[nm].a[0][2];
		w.a[1][3] = q[nm].a[1][3];
		/*
		  1 2 3 4			1 7 2 4
		  8 7 6 5 ------->	8 6 3 5
		 */
	}
	return w;
}
void print(int nm) {									//递归输出
	if (nm == 1) return ;
	print(prt[nm]);
	cout << a[nm];
}
void bfs() {
	int head = 1/*前*/, tail = 1/*后*/, w;
	node wt;
	q[1] = st;
	step[1] = 0;
	prt[1] = 1;
	while (head <= tail) {
		//		cout << "★★★★★\n";
		for (char i = 'A'; i <= 'C'; i ++) {			//一一枚举
			wt = zhuan(i, head);
			w = cantor(wt);
			if (!vis[w]) {
				vis[w] = 1;
				q[++tail] = wt;
				step[tail] = step[head] + 1;
				prt[tail] = head;
				a[tail] = i;
				if (w == l) {
					cout << step[tail] << endl;
					print(tail);
					return ;
				}
			}
		}
		head ++;
	}
}
int main() {
	for (int i = 0; i <= 3; i ++) {
		st.a[0][i] = i + 1;
		st.a[1][i] = 8 - i;
	}
//	for (int i = 0; i <= 3; i ++) cout << st.a[0][i] << ' ';
//	cout << endl;
//	for (int i = 0; i <= 3; i ++) cout << st.a[1][i] << ' ';
	/*
	  1 2 3 4
	  8 7 6 5
	 */
	cin >> lt.a[0][0] >> lt.a[0][1] >> lt.a[0][2] >> lt.a[0][3];
	cin >> lt.a[1][0] >> lt.a[1][1] >> lt.a[1][2] >> lt.a[1][3];
//	for (int i = 0; i <= 3; i ++) cout << lt.a[0][i] << ' ';
//	cout << endl;
//	for (int i = 0; i <= 3; i ++) cout << lt.a[1][i] << ' ';
	s = cantor(st);
	l = cantor(lt);
	vis[s] = 1;
	if (l == s) return cout << 0, 0;
	bfs();
	return 0;
}
2025/1/13 10:18
加载中...