bdpq

bdpq

官方入驻
9.3
Hi,Tapper为游戏体验打分吧~

全部评价

近期趋势
9.3493个评价
带图2 长评8 游戏时长 1h+好评中评差评
蓝白
玩过
写了个程序把游戏秒了……
感谢各位玩家之前的评价,我是比较膜拜各位自己总结出规律的,由于我比较菜,只能写写代码了。
下面是程序代码,比较暴力……
如大家所说,上下与左右是不相关的,故此程序只解其中一种状态
代码仍有许多可优化之处,还请大家谅解
---------我是分割线----------
#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的多寡决定何者为所需翻动的卡片)
输入范例:
01000
11111
01000
01000
01000
输出范例:
00000
01000
00000
00000
评价:
UI简洁好看。
玩法可玩性高,理论上,n阶可以有
(2^(n^2)-2)*2^(n^2)
种关卡(未排除对称、旋转重回关卡)
bdpq这些放一起实在是太像了,玩着有点眼花2333
如果出个diy卡片颜色(或皮肤)什么的可能会舒服些2333
由于我懒+菜,就当作锻炼写代码啦_(:3」∠)_
蓝白 : 看了下论坛发现原来已经有最优解法了_(:з」∠)_膜拜膜拜
Sir pneumonia
游戏时长 98 分钟
值得一玩。模式稍微有点枯燥,最多封顶5*5,缺少那么点兴奋感,不过也还可以了。似乎没什么广告大赞!!我研究了一下,毫无头绪的话可以来看看。(已更新方法,无脑流氓法直接见分割线更新的部分,前面的可作参考资料)(还是不懂的先看最后例子)
◆⒈这游戏的操作有两个自由度,也就是二维的,分别是纵和横,可以独立地来操作这两个维度。每个自由度有两个态,分别是上下与左右:具体地,也就是在横向变换上,bp属于一个态(看字母的形状),qd属于另一个态;同理,对纵向变换来说,bd属于一个态,qp算另一个态。我们可以独立对两个方向分别进行操作,两个方向互不影响。
◆⒉当玩到后面矩阵变大了就没法瞎玩了,这对应物理上的熵增原理,即系统的无序度总是倾向于变大的。那么要达成目标我们应该想办法让系统变得有序,而有序的特征便是对称性!要从对称的角度来想办法。具体地,我是这么考虑的:根据前面第一条,我们可以一次只考虑一个方向的整理,完成之后再搞定另一个方向。首先通过几个直观的变换将各个元素尽可能多地变成某一个态(如:4*4的模式下,考虑横向变换,开局是8个b/p态,8个q/d态。我们考虑把它们初步变换成尽量多的d/q态,那么选择一个元素,如果由它展开的十字形区域包含4、5、6或7个的p/b态,我们就就行一次左右变换,这样就有了更多的d/q态。如上操作直到极限)。这样之后就比较清爽了,剩下不多的p/d态(上面例子里面的情形)往往有几个是对称的,考虑以它们为线索进行一些对称的操作,一部分一部分地考虑,慢慢就能搞成同一个态了。
◆3.对称操作举例:同样是上面所述的4*4情形中。a.对某一行(列)全部进行左右(上下)变换,可以使除这行(列)的元素全部翻转;b.画个坐标系,对(1,4),(1,3),(1,2),(4,4),(4,3),(4,2)全部进行左右变换,可以使(1,1)、(4,1)发生翻转。等等。聪明的人可能已经发现了,这个操作的效果和矩阵具体维数也有关系,以上例子只适用4*4情形,5*5要重新找规律,不过不是太难找的。
前来提供一种套路,希望能给一头雾水的小伙伴一些帮助。物理狗用了一点专业名词,我感觉应该写得还算清楚吧,看不懂可以问我。
我按这个套路走感觉有点像做中级数独那种感觉,可以做出来不过有点小辛苦,玩久了有点小枯燥,所以四星。
============日常更新(流氓方法)=========
!!!!!发现一种流氓法,根据第一条,再用一点记忆力就行了:把所有的相同态一次性进行相应自由度的操作就能完成这个自由度的整理了。比如把初始态里面所有b/p的位置记住,对这些位置都进行一次左右操作,这样横向就整理好了。纵向同理。这个我在5*5里面试了几次都成功了,不造有没有例外。(具体的例子我在最后加上了)
●这个我今天在考虑不对称性的来源,原理上讲,所有的不对称性都来源于那些不同的元素,那么对它们同时进行操作,就是最合适的对应于当前情形的“对称”操作了。(获得终极奥义:哪些不对点哪些)
●今天又试了下,好像有的矩阵用这方法一次整理不出来,不过会变得简单很多。懒得推敲的话重复使用流氓法就好了。
●========再来更新加个栗子===========
bppp
pppp
bppp
pppp
把当前所有b的位置(1,4)(1,2)进行上下操作即可。若一次没有成功则重复该过程。
具体过程:
一次变换后
bbbb
pppp
bbbb
pppp
根据原理,接着把第一、三行全部上下变换
得到
pppp
pppp
pppp
pppp
完成。当然,选择p而不是b作为变换对象也是可以的。
官方睡神飞工作室拾薪者 : 相当好,我按照你这个攻略已经成功突破第一关了,你真是个小机灵鬼