目录
第一章 命运与审判
(1)魔王
(2)绝望的开始
(3)叹浮生若梦
(4)zaie之门
(5)希望的光辉
(6)规则的shufu
(7)缘起生生
第二章 怀抱着的终焉
(1)彼岸花开
(2)千世幻梦
(3)孤独与等待
(4)情不为生死
(5)重合的始终
(6)形而上的希望
(7)梦与现实
(8)悲剧之环
(9)形而下的崩坏
(10)背靠终焉
(11)缘注定生死
第三章 信仰的异变
(1)神不在的世界
(2)秩序之下的暗流
(3)虚伪者的微笑
(4)暗潮的涌动
(5)神之子
(6)风暴前的宁静
(7)三生石三生路
(8)自然之子
(9)强大的弱小
(10)禁忌的贪念
(11)亚都之行
(12)命运的齿轮
第四章 生而为罪恶
(1)黑暗蔓延
(2)初生
(3)善意
(4)成长之路
(5)善始
(6)自然之子
(7)天选之人
(8)生而为罪恶
(9)命运之印
(10)光之圣所
(11)逝光之殇
(12)守护之印
(13)过去
(14)未来
(15)黑暗之旅
(16)逆光之旅
(17)万水千山
(18)信仰之心
(19)亚都
(20)光之都
(21)光明咏唱
(22)希望
(23)超越的力量
(24)触碰的禁忌
(25)谎言与偶然
(26)先知
(27)神力束缚
(28)神逝遗光
第五章 禁止的禁忌
(1)
(2)
(3)
(4)贪婪
(5)操纵
(6)威胁
(7)奉献
(8)选择
(9)此生不换
(10)审判日▪上
(11)审判日▪下
(12)叹息
(13)罪恶之花
(14)围观者
(15)宽容的对立
(16)世界碎片
(17)平静的愤怒
(18)共生双面
(19)压制
(20)
(21)力量的逝去
(22)谎言与欺骗
(23)泯灭
(24)指尖的绝望
(25)存在的意义
(26)强大的无力
(27)孤独
(28)界限解除
(29)无力的强大
(30)
(31)光黯
(32)
(33)
(34)折翼之殇
(35)释放
(36)传说
(37)镜面规则
(38)隐居
(39)红尘凡事
(40)静候花开
计算机求解
同一个世界OL引入了世界关卡,也就是玩家自主设计关卡,其他的玩家来破解。
不像同一个世界,游戏关卡都很对称,比较简单,世界关卡里面有一些很难的关卡。
我写了个程序来破解关卡,不过水平有限,6行5列的关卡大概会需要10秒钟,再大一点的关卡就基本上算不出来了。
思路:
从一个起点出发,使用深度优先搜索,列出所有可能的路径,利用状态压缩把一条路径映射到1个64位的整数。
另外一个起点也是同样处理,这样就得到2个差不多大小的集合S1、S2
然后遍历S1中的元素,和需要得到的最终结果进行1次位运算直接得到需要的另一条路径,然后查找S2是否包含此路径
代码:
#include<iostream>
#include<set>
using namespace std;
#define ll long long
const ll r = 6, c = 5; //需要手动修改
int x1 = 0, yy1 = 2, x2 = 5, y2 = 1, result = 20882777; //需要手动修改
int has[r][c] = //需要手动修改
{
1, 1, 1, 1, 1,
1, 0, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1
};
int num[r][c];
set<pair<ll, pair<int, int>>>se;
set<ll>se1, se2;
bool ok(int x, int y)
{
if (x < 0 || x >= r)return false;
if (y < 0 || y >= c)return false;
if (num[x][y])return false;
return has[x][y];
}
void dfs(int x, int y)
{
num[x][y] = 1;
ll res = 0;
for (int i = 0; i < r; i++)for (int j = 0; j < c; j++)res = res * 2 + num[i][j];
int si = se.size();
se.insert(make_pair(res, make_pair(x, y)));
if (si < se.size())
{
if (ok(x + 1, y))dfs(x + 1, y);
if (ok(x - 1, y))dfs(x - 1, y);
if (ok(x, y + 1))dfs(x, y + 1);
if (ok(x, y - 1))dfs(x, y - 1);
}
num[x][y] = 0;
}
void out(ll n)
{
ll k = 1 << (r*c);
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
k /= 2;
if (n&k)cout << "●";
else cout << "○";
}
cout << endl;
}
cout << endl;
}
int main()
{
se.clear();
se1.clear();
se2.clear();
for (int ii = 0; ii < r; ii++)for (int jj = 0; jj < c; jj++)num[ii][jj] = 0;
dfs(x1, yy1);
set<pair<ll, pair<int, int>>>::iterator it;
for (it = se.begin(); it != se.end(); it++)se1.insert(it->first);
se.clear();
for (int ii = 0; ii < r; ii++)for (int jj = 0; jj < c; jj++)num[ii][jj] = 0;
dfs(x2, y2);
for (it = se.begin(); it != se.end(); it++)se2.insert(it->first);
set<ll>::iterator it1;
for (it1 = se1.begin(); it1 != se1.end(); it1++)
if (se2.find((*it1) ^ result) != se2.end())
{
out(*it1);
out((*it1) ^ result);
return 0;
}
ll temp = 1;
for (int i = r - 1; i >= 0; i--)for (int j = c - 1; j >= 0; j--)
result -= has[i][j] * temp, temp *= 2;
result *= -1;
for (it1 = se1.begin(); it1 != se1.end(); it1++)
if (se2.find((*it1) ^ result) != se2.end())
{
out(*it1);
out((*it1) ^ result);
}
return 0;
}
使用说明:
代码中有3行标注了 //需要手动修改 ,一共7个整数和1个数组,运行之前根据关卡的实际情况进行修改即可
然后运行即可得到答案。
示例:
一共6行5列,俩起点的坐标分别是(0,2)(5,1),
接下来把颜色信息表示出来,黄色和白色随便哪个对应1,另外一个对应0,空的地方一定是对应0
也就是上图可表示为111110010000010101101010100110或者000001001111101010010101011001
然后把上述两个二进制整数转换成十进制,可以利用在线进制转换
至此,一共得到7个整数,分别是6,5,0,25,1,1044470438或20882777,依次写到代码里面
最后还有一个has数组,就是用1表示有点(不管颜色),0表示空的地方
如此就完成了代码
运行结果:
由白色的实心圆构成的路径就是我们需要的答案了