HDU 7447 求调
查看原帖
HDU 7447 求调
857626
_RainCappuccino_楼主2025/1/6 16:40

给定一个魔方展开图,该魔方的同一个角上的两片贴纸被打乱,且被扭了不超过三次(扭的是侧面,不是中间层,且扭的角度固定为90度)

调急眼了……

code:

#include <bits/stdc++.h>
using namespace std;
string mb[10] = {
	"",
	" ***111******",
	" ***111******",
	" ***111******",
	" 222333444555",
	" 222333444555",
	" 222333444555",
	" ***666******",
	" ***666******",
	" ***666******"
};
struct mf {
	string c[10];
	void print () {
		for (int i = 1; i <= 9; i ++) {
			for (int j = 1; j <= 12; j ++) cout << c[i][j];
			cout << endl;
		}
	}
};
mf change (mf now, int tp) {
	mf res = now;
	if (tp == 1) {
		res.c[4][7] = now.c[3][4];
		res.c[5][7] = now.c[3][5];
		res.c[6][7] = now.c[3][6];
		res.c[7][6] = now.c[4][7];
		res.c[7][5] = now.c[5][7];
		res.c[7][4] = now.c[6][7];
		res.c[4][3] = now.c[7][4];
		res.c[5][3] = now.c[7][5];
		res.c[6][3] = now.c[7][6];
		res.c[3][4] = now.c[6][3];
		res.c[3][5] = now.c[5][3];
		res.c[3][6] = now.c[4][3];
	} else if (tp == 2) {
		res.c[3][4] = now.c[4][7];
		res.c[3][5] = now.c[5][7];
		res.c[3][6] = now.c[6][7];
		res.c[4][7] = now.c[7][6];
		res.c[5][7] = now.c[7][5];
		res.c[6][7] = now.c[7][4];
		res.c[7][4] = now.c[4][3];
		res.c[7][5] = now.c[5][3];
		res.c[7][6] = now.c[6][3];
		res.c[6][3] = now.c[3][4];
		res.c[5][3] = now.c[3][5];
		res.c[4][3] = now.c[3][6];
	} else if (tp == 3) {
		for (int i = 4; i <= 12; i ++) res.c[4][i] = now.c[4][i - 3];
		res.c[4][1] = now.c[4][10];
		res.c[4][2] = now.c[4][11];
		res.c[4][3] = now.c[4][12];
	} else if (tp == 4) {
		for (int i = 1; i <= 9; i ++) res.c[4][i] = now.c[4][i + 3];
		res.c[4][10] = now.c[4][1];
		res.c[4][11] = now.c[4][2];
		res.c[4][12] = now.c[4][3];
	} else if (tp == 5) {
		for (int i = 4; i <= 12; i ++) res.c[6][i] = now.c[6][i - 3];
		res.c[6][1] = now.c[6][10];
		res.c[6][2] = now.c[6][11];
		res.c[6][3] = now.c[6][12];
	} else if (tp == 6) {
		for (int i = 1; i <= 9; i ++) res.c[6][i] = now.c[6][i + 3];
		res.c[6][10] = now.c[6][1];
		res.c[6][11] = now.c[6][2];
		res.c[6][12] = now.c[6][3];
	} else if (tp == 7) {
		res.c[4][9] = now.c[1][4];
		res.c[5][9] = now.c[1][5];
		res.c[6][9] = now.c[1][6];
		res.c[9][6] = now.c[4][9];
		res.c[9][5] = now.c[5][9];
		res.c[9][4] = now.c[6][9];
		res.c[4][1] = now.c[9][4];
		res.c[5][1] = now.c[9][5];
		res.c[6][1] = now.c[9][6];
		res.c[1][4] = now.c[6][1];
		res.c[1][5] = now.c[5][1];
		res.c[1][6] = now.c[4][1];
	} else if (tp == 8) {
		res.c[1][4] = now.c[4][9];
		res.c[1][5] = now.c[5][9];
		res.c[1][6] = now.c[6][9];
		res.c[4][9] = now.c[9][6];
		res.c[5][9] = now.c[9][5];
		res.c[6][9] = now.c[9][4];
		res.c[9][4] = now.c[4][1];
		res.c[9][5] = now.c[5][1];
		res.c[9][6] = now.c[6][1];
		res.c[6][1] = now.c[1][4];
		res.c[5][1] = now.c[1][5];
		res.c[4][1] = now.c[1][6];
	} else if (tp == 9){
		for (int i = 4; i <= 9; i ++) {
			res.c[i][4] = now.c[i - 3][4];
		}
		res.c[1][4] = now.c[6][12];
		res.c[2][4] = now.c[5][12];
		res.c[3][4] = now.c[4][12];
		
		res.c[6][12] = now.c[7][4];
		res.c[5][12] = now.c[8][4];
		res.c[4][12] = now.c[9][4];
	} else if (tp == 10) {
		for (int i = 4; i <= 9; i ++) {
			res.c[i - 3][4] = now.c[i][4];
		}
		res.c[6][12] = now.c[1][4];
		res.c[5][12] = now.c[2][4];
		res.c[4][12] = now.c[3][4];
		res.c[7][4] = now.c[6][12];
		res.c[8][4] = now.c[5][12];
		res.c[9][4] = now.c[4][12];
	} else if (tp == 11){
		for (int i = 4; i <= 9; i ++) {
			res.c[i][6] = now.c[i - 3][6];
		}
		res.c[1][6] = now.c[6][10];
		res.c[2][6] = now.c[5][10];
		res.c[3][6] = now.c[4][10];
		
		res.c[6][10] = now.c[7][6];
		res.c[5][10] = now.c[8][6];
		res.c[4][10] = now.c[9][6];
	} else if (tp == 12) {
		for (int i = 4; i <= 9; i ++) {
			res.c[i - 3][6] = now.c[i][6];
		}
		res.c[6][10] = now.c[1][6];
		res.c[5][10] = now.c[2][6];
		res.c[4][10] = now.c[3][6];
		res.c[7][6] = now.c[6][10];
		res.c[8][6] = now.c[5][10];
		res.c[9][6] = now.c[4][10];
	}
	return res;
}
bool flag = 0;
bool check (mf x) {
	int cnt = 0;
	for (int i = 1; i <= 9; i ++) {
		for (int j = 1; j <= 12; j ++) {
			if (x.c[i][j] != mb[i][j]) cnt ++;
		}
	}
	if (cnt == 0) { flag = 1; return 1;}
	return cnt == 2;
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while (t --) {
		flag = 0;
		mf now;
		for (int i = 1; i <= 9; i ++) {
			now.c[i].resize(13);
			for (int j = 1; j <= 12; j ++) {
				cin >> now.c[i][j];
			}
		}
		mf beg;
		for (int i = 1; i <= 12; i ++) {
			mf nxt = change(now, i);
			if (check(nxt)) {
				beg = nxt;
			}
			nxt.print();
			cout << endl;
			for (int j = 1; j <= 12; j ++) {
				mf nnxt = change(nxt, j);
				if (check(nnxt)) {
					beg = nnxt;
				}
				for (int k = 1; k <= 12; k ++) {
					mf nnnxt = change(nnxt, k);
					if (check(nnnxt)) {
						beg = nnnxt;
					}
				}
			}
		}
		if (flag) {
			cout << "No problem\n";
			continue;
		}
		if (beg.c[1][4] != '1' || beg.c[4][1] != '2' || beg.c[4][12] != '5') cout << "1 2 5\n";
		else if (beg.c[3][4] != '1' || beg.c[4][4] != '3' || beg.c[4][3] != '2') cout << "1 2 3\n";
		else if (beg.c[3][6] != '1' || beg.c[4][6] != '3' || beg.c[4][7] != '4') cout << "1 3 4\n";
		else if (beg.c[6][6] != '3' || beg.c[6][7] != '4' || beg.c[7][6] != '6') cout << "3 4 6\n";
		else if (beg.c[6][3] != '2' || beg.c[7][4] != '6' || beg.c[6][4] != '3') cout << "2 3 6\n";
		else if (beg.c[1][6] != '1' || beg.c[4][9] != '4' || beg.c[4][10] != '5') cout << "1 4 5\n";
		else if (beg.c[6][9] != '4' || beg.c[6][10] != '5' || beg.c[9][6] != '6') cout << "4 5 6\n";
		else if (beg.c[6][1] != '2' || beg.c[9][4] != '6' || beg.c[6][12] != '5') cout << "2 5 6\n";
	}
	return 0;
}
2025/1/6 16:40
加载中...