puzzle(0814)LinesXFree、六面来风、消除黑六边形、闪亮的灯光

目录

LinesXFree

线条合并成长线

线条合并成团

六面来风

简单模式

普通模式

困难模式

消除黑六边形

闪亮的灯光

策略一

策略二


LinesXFree

给定若干条线的起点和终点,经过所有的点,连成若干条线。

(5)

  

(8)

 

(12)

 

线条合并成长线

如果2条线的端点挨着,那么就可以联合起来做连通性分析。

(14)

 这2条线连起来,几乎分割了整个盘面,所以除了最左边一条线,其他线的两个点都必须在这条长线的一侧。

再往下推就很容易了。

线条合并成团

线条合并如果成环,即构成一团,其他线条的两个端点要么都在里面要么都在外面。

(16)

六面来风

最强大脑同款项目,即“六面来风、岿然不动”的B项目。

数字代表可以延伸出去的数量,规划如何延伸刚好填满所有格子。

以下是麦麦鱼做的同款项目,做的有点问题,正视图是对的,左视图是镜像的,俯视图是旋转90度的。

简单模式

答案:

普通模式

答案:

思路很简单,先从数字大的开始推,每一个都是确定的。

困难模式

 

 答案:

其实思路还是从大的数字开始,不过这一关稍微复杂点,要把大的数字组合起来分析,有点像扫雷。

最终答案:

消除黑六边形

在线play

规则就是选一个起点和一个方向,这个方向上的黑块全部消除,同时这个方向最后一个格子所在直线上的黑块全部消除。规定步数内消除全部黑块。

规则来看,其实和点亮细胞差不多。

(7)

左上角是规定步数。

解法:

 (8)

 

闪亮的灯光

在线play

对六边形网络操作,每次让一条线上的格子变色,最终全部变色即过关。

每个格子有2个状态,和点亮所有的灯是一样的。

(9)

边上的白条是机关,操作对应的直线,空六边形格子是墙,操作无法透过去。

先弄大块的:

这个就是再微调一下就好了。

策略一

策略一就是先弄大块的,最后再微调。这个策略主要对含有空六边形格子的关卡有效。

 (11)

带圆洞的六边形是空格,操作可以透过去。

先搞大块的:

再调一下:

 再调一下:

 

这就好了。

 (15)

其实这个问题的本质和点亮所有的灯一样,就是求一个异或方程组,求解目标就是每个机关的点击次数是0还是1。接下来的推导,等号就表示异或相等。

首先发现一个格子,只有一个机关能影响,于是这个机关也确定了:

接下来取这2个格子,可以分析出这3个机关的关系:

再取这2个格子,可以分析出这2个机关的答案:

同理,继续得到:

可以算出x=1,于是上图里面有4个1,都点击之后变成:

最后再点一次,结束。

策略二

高斯消元法。第15关描述的方法,其实就是高斯消元法。

(24)

 先弄大块的:

再微调:

 再微调:

结束。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我会给你讲解如何使用SFML来实现n-puzzle游戏的可视化。首先,我们需要了解一下SFML是什么。 SFML是一个跨平台的图形库,它提供了简单易用的API,可以帮助我们快速创建2D游戏和图形应用程序。它支持多种编程语言,包括C++、Python、Java等。 接下来,我们可以开始实现n-puzzle游戏的可视化了。首先,我们需要创建一个窗口来显示游戏界面。以下是创建窗口的代码: ```cpp #include <SFML/Graphics.hpp> int main() { sf::RenderWindow window(sf::VideoMode(800, 600), "N-Puzzle Game"); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(sf::Color::White); // 绘制游戏界面 window.display(); } return 0; } ``` 这段代码创建了一个800x600大小的窗口,并且在每一帧中都会清空窗口并绘制游戏界面。接下来,我们需要实现游戏界面的绘制。 n-puzzle游戏的界面由一个N*N的网格组成,每个格子中都会有一个数字。我们可以使用SFML中的矩形来表示每个格子,并且使用文本来显示数字。以下是绘制游戏界面的代码: ```cpp const int N = 3; const int tileSize = 100; sf::RectangleShape tile(sf::Vector2f(tileSize, tileSize)); tile.setFillColor(sf::Color::White); tile.setOutlineColor(sf::Color::Black); tile.setOutlineThickness(2); sf::Font font; font.loadFromFile("arial.ttf"); sf::Text text("", font, tileSize / 2); text.setFillColor(sf::Color::Black); text.setStyle(sf::Text::Bold); text.setOrigin(text.getGlobalBounds().width / 2, text.getGlobalBounds().height / 2); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { int number = i * N + j + 1; if (number == N * N) continue; tile.setPosition(j * tileSize, i * tileSize); text.setString(std::to_string(number)); text.setPosition(j * tileSize + tileSize / 2, i * tileSize + tileSize / 2); window.draw(tile); window.draw(text); } } ``` 这段代码首先定义了每个格子的大小为100x100,并且使用白色填充和色边框。然后,它加载了一个字体文件,并且创建了一个文本对象来显示数字。最后,它使用两个嵌套循环来绘制整个游戏界面。 这样,我们就完成了n-puzzle游戏的可视化。完整代码如下: ```cpp #include <SFML/Graphics.hpp> const int N = 3; const int tileSize = 100; int main() { sf::RenderWindow window(sf::VideoMode(N * tileSize, N * tileSize), "N-Puzzle Game"); sf::RectangleShape tile(sf::Vector2f(tileSize, tileSize)); tile.setFillColor(sf::Color::White); tile.setOutlineColor(sf::Color::Black); tile.setOutlineThickness(2); sf::Font font; font.loadFromFile("arial.ttf"); sf::Text text("", font, tileSize / 2); text.setFillColor(sf::Color::Black); text.setStyle(sf::Text::Bold); text.setOrigin(text.getGlobalBounds().width / 2, text.getGlobalBounds().height / 2); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(sf::Color::White); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { int number = i * N + j + 1; if (number == N * N) continue; tile.setPosition(j * tileSize, i * tileSize); text.setString(std::to_string(number)); text.setPosition(j * tileSize + tileSize / 2, i * tileSize + tileSize / 2); window.draw(tile); window.draw(text); } } window.display(); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值