写了个程序把游戏秒了……感谢各位玩家之前的评价,我是比较膜拜各位自己总结出规律的,由于我比较菜,只能写写代码了。下面是程序代码,比较暴力……如大家所说,上下与左右是不相关的,故此程序只解其中一种状态代码仍有许多可优化之处,还请大家谅解---------我是分割线----------#include<iostream>#include<cmath>#define N 25 //对应5阶using namespace std;bool q[33554432];//数组规模为2^25,修改此处与N的定义值可解出更高阶unsigned short num(int m,int n) {unsigned short p = m % 2;while (n > 0) {m /= 2;p = m % 2;n--;}return p;}int pow2(int n) {int output = 1;while (n > 0) {output *= 2;n--;}return output;}int flap(int m, int n) {int a = (int)sqrt(N);int r = n / a;int c = n - a*r;m += pow2(n)*(1 - 2 * num(m, n));for (int i = 0; i < a; i++)m += pow2(r*a + i)*(1 - 2 * num(m, r*a + i));for (int i = 0; i < a; i++)m += pow2(c + i*a)*(1 - 2 * num(m, c + i*a));return m;}void outputmap(int m) {int a = (int)sqrt(N);cout << "--------" << endl;for (int i = 0; i < N; i++) {cout << m % 2;m /= 2;if (i%a == a - 1)cout << endl;}}void dfs(int m, int c) {if (q[m])return;else q[m] = true;if (m == 0 || m == pow2(N) - 1) {outputmap(c); return;}for (int i = 0; i < N; i++) {if (num(c, i) == 0)dfs(flap(m, i), c + pow2(i));}}int main() {int map = 0;for (int i = 0; i < N; i++) {char p;cin >> p;map += (p - '0')*pow2(i);}dfs(map, 0);return 0;}输入格式:对于n阶,输入n行,每行n个字符字符为数字0或1,对应翻转的两种状态输出格式:n行,每行n个字符;字符0代表不翻动此位置的卡片;字符1代表翻动此位置的卡片。(当然,大家可根据0与1的多寡决定何者为所需翻动的卡片)输入范例:0100011111010000100001000输出范例:00000010000000000000评价:UI简洁好看。玩法可玩性高,理论上,n阶可以有(2^(n^2)-2)*2^(n^2)种关卡(未排除对称、旋转重回关卡)bdpq这些放一起实在是太像了,玩着有点眼花2333如果出个diy卡片颜色(或皮肤)什么的可能会舒服些2333由于我懒+菜,就当作锻炼写代码啦_(:3」∠)_
11

