微信小程序:一起玩连线

游戏玩法

  将相同颜色的结点连接在一起,连线之间不能交叉。

  

算法思想

  转换为多个源点到达对应终点的路径问题,且路径之间不相交。按照dfs方式寻找两个结点路径,一条路径探索完之后,标记地图并记录路径,然后探索下一条路径,以此类推。路径探索失败之后,地图进行标记回退,路径也回退。

import com.sun.org.apache.xml.internal.serialize.LineSeparator;
import java.util.*;
import java.util.stream.IntStream; /**
* @author hujunzheng
* @create 2018-07-01 16:12
**/
public class LineTogether { private static final int[][] dir = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}}; private boolean[][] map; private List<TogetherNode> togetherNodes; public LineTogether() {
Scanner scanner = new Scanner(System.in);
int width = scanner.nextInt();
int height = scanner.nextInt();
int pairNodes = scanner.nextInt(); this.map = new boolean[width + 2][];
for (int i = 0; i < width + 2; ++i) {
map[i] = new boolean[height + 2];
} for (int i = 1; i <= width; ++i) {
for (int j = 1; j <= height; ++j) {
map[i][j] = true;
}
} togetherNodes = new ArrayList<>();
IntStream.range(0, pairNodes).forEach(i -> {
int bx = scanner.nextInt();
int by = scanner.nextInt();
map[bx][by] = false;
Node begin = new Node(bx, by);
int ex = scanner.nextInt();
int ey = scanner.nextInt();
map[ex][ey] = false;
Node end = new Node(ex, ey);
togetherNodes.add(new TogetherNode(begin, end));
}); this.printMap();
} public void resolve() {
if (this.togetherNodes.size() == 0) {
return;
}
Node begin = togetherNodes.get(0).begin;
Node end = togetherNodes.get(0).end;
boolean success = this.process(0, begin.x, begin.y, end.x, end.y);
System.out.println(success ? "路径探测成功" : "路径探测失败");
} private void printMap() {
StringBuilder result = new StringBuilder();
for (int i = 0; i < map.length; ++i) {
for (int j = 0; j < map[i].length; ++j) {
result.append(map[i][j] ? 1 : 0).append(" ");
}
result.append(LineSeparator.Windows);
}
System.out.println(result.toString());
} private boolean process(int ix, int bx, int by, int ex, int ey) {
//如果 map[bx][by] == false, 说明是端点
boolean endpoint = !map[bx][by];
map[bx][by] = false;
List<Node> path = togetherNodes.get(ix).path;
path.add(new Node(bx, by));
//到达终点
if (bx == ex && by == ey) {
if (ix + 1 >= togetherNodes.size()) {
return true;
}
Node begin = togetherNodes.get(ix + 1).begin;
Node end = togetherNodes.get(ix + 1).end;
//下一个路径探索
boolean success = this.process(ix + 1, begin.x, begin.y, end.x, end.y);
if (success) return success;
} else {
for (int i = 0; i < dir.length; ++i) {
int nextx = bx + dir[i][0];
int nexty = by + dir[i][1];
//如果节点标记为false,并且节点不是终节点的时候
if (!map[nextx][nexty] && !(nextx == ex && nexty == ey)) {
continue;
} boolean success = this.process(ix, nextx, nexty, ex, ey);
if (success) return true;
}
} if (!endpoint) {
map[bx][by] = true;
}
path.remove(path.size() - 1);
return false;
} public String fetchResult() {
if (togetherNodes.size() == 0) {
return "";
}
StringBuilder result = new StringBuilder();
togetherNodes.stream().map(TogetherNode::getPath).forEach(
path -> {
for (Iterator<Node> it = path.iterator(); it.hasNext(); ) {
Node node = it.next();
result.append("(")
.append(node.x)
.append(":")
.append(node.y)
.append(")");
if (it.hasNext()) {
result.append("->");
}
}
result.append(LineSeparator.Windows);
}
); return result.toString();
} private class Node {
public int x;
public int y; public Node(int x, int y) {
this.x = x;
this.y = y;
}
} private class TogetherNode {
public Node begin;
public Node end; private List<Node> path; public TogetherNode(Node begin, Node end) {
this.begin = begin;
this.end = end;
path = new ArrayList<>();
} public List<Node> getPath() {
return path;
}
} public static void main(String[] args) {
LineTogether lt = new LineTogether();
lt.resolve();
System.out.println(lt.fetchResult());
}
}

输入数据

5 5 5
3 1 1 4
4 1 4 5
4 2 2 3
4 4 5 5
1 5 2 4

输出数据

路径探测成功
(3:1)->(2:1)->(1:1)->(1:2)->(1:3)->(1:4)
(4:1)->(5:1)->(5:2)->(5:3)->(4:3)->(3:3)->(3:4)->(3:5)->(4:5)
(4:2)->(3:2)->(2:2)->(2:3)
(4:4)->(5:4)->(5:5)
(1:5)->(2:5)->(2:4)

操作效果

  

微信小程序:一起玩连线,一个算法来搞定的更多相关文章

  1. 微信小程序怎么用?线下商家最适合玩小程序

    随着微信小程序不断地释放新功能,许多行业越来越关注小程序,目前已经有不少餐饮和线下传统零售企业开始谋划利用好小程序.但是,线下商业有着复杂的场景,如何针对自己行业的特点和需求开发出属于自己的小程序,是 ...

  2. 微信小程序如何玩转分销

    截止目前,微信月活跃用户已经高达8.89亿,微信这个庞大的互联网巨头下一个目标是什么? 打造属于自己的“AppStore”.小程序正是完成这个微信生态体系的一块完美拼板, 张小龙预言:未来2年内,小程 ...

  3. 第一个微信小程序(实现点击一个按钮弹出toast)

    今天根据网上的教程搭建了微信小程序的环境,然后看文档做了一个简单的小应用. 项目的目录是这个样子的: app.js.app.json.app.wxss是全局文件,必不可少的文件.定义在app.wxss ...

  4. 微信小程序——手把手教你写一个微信小程序

    前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...

  5. 用Taro写一个微信小程序(一)——开始一个项目

    一.Taro简介 1.名字由来 Taro['tɑ:roʊ],泰罗·奥特曼,宇宙警备队总教官,实力最强的奥特曼. 2.taro是什么 Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vu ...

  6. 当小程序遇见物联网IoT,几行代码搞定智能插座控制

    在 5G 热潮的推动下,与其紧密结合的物联网(IoT)正日益成为个人和企业工作生活中的重要组成部分,它为企业和个人带来了操作流程的改进和更好的生活体验,随着人工智能(AI)技术的日趋成熟,IoT 与 ...

  7. 微信小程序中跳转另一个小程序

    wx.navigateToMiniProgram({ appId: 'xxxxxxxxxxxxxxxxxx', // 要跳转的小程序的appid path: 'page/index/index', / ...

  8. 一个微信小程序跳转到另一个微信小程序

    简单来说分两步走: 1.配置项目根目录的 app.json 文件中的 navigateToMiniProgramAppIdList { "pages": [ "pages ...

  9. 【微信小程序开发】快速开发一个动态横向导航模板并使用

    目标:做个横向导航,可以横向滚动. 思路:使用scroll-view组件,可实现横向滚动功能.scroll-view内包含一个动态的view列表,代表导航的每一项,导航要接收动态数组,然后使用列表展示 ...

随机推荐

  1. Database学习 - mysql 数据库 多表/复合/子 查询

    多表查询 多表查询,基本规则,通过两表有关联字段的进行条件匹配查询 内连接查询 方式一: SELECT 查看字段名[,查看字段名] FROM 一表名,二表名 WHERE 一/二表.字段 = 一/二表. ...

  2. python - 包装 和 授权

    包装 # 包装(二次加工标准类型) # 继承 + 派生 的方式实现 定制功能 # 示例: # class list_customization(list): #重新定制append方法,判断添加的数据 ...

  3. 2、SpringBoot接口Http协议开发实战8节课(7-8)

    7.SpringBoot2.x文件上传实战 简介:讲解HTML页面文件上传和后端处理实战 1.讲解springboot文件上传 MultipartFile file,源自SpringMVC 1)静态页 ...

  4. java工程师之旅-一个月工作心得

    不知不觉,在工作中已经度过一个月,距离上次写文章已经好几个月了,正好还有二十分钟下班,抽点时间来写一下博文,写一下心得. 首先说一下,在我工作之前,做了一个项目,和一个外校大四的学生做一个毕业设计,一 ...

  5. 使用xmanager图形化远程连接rhel6

    使用xmanager图形化远程连接rhel6 xmanager中Xbrowser可以提供图形化桌面远程.和vnc比,可以类似于本地一样用户切换. 操作步骤: linux服务端: 1:查看/etc/in ...

  6. 嵌入式系统C编程之堆栈回溯

    前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外 ...

  7. Linux内核驱动基础(一)常用宏定义【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/9427081 一: __init和__initdata  : __exit和__exitdata ...

  8. 递归与尾递归(C语言)【转】

    作者:archimedes 出处:http://www.cnblogs.com/archimedes/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原 ...

  9. lnmp使用socket方式连接nginx优化php-fpm性能

    lnmp使用socket方式连接nginx优化php-fpm性能 Nginx连接fastcgi的方式有2种:TCP和unix domain socket 什么是Unix domain socket?- ...

  10. saltStack的event接口通过mysql数据库接收SaltStack批量管理日志

    event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统.每个event都有一个标签.事件标签允许快速制定过滤事件.除了标签 ...