微信小程序:一起玩连线

游戏玩法

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

  

算法思想

  转换为多个源点到达对应终点的路径问题,且路径之间不相交。按照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. ANR异常及traces信息解析

    Application Not Responding:默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒.超出就会提示应用程 ...

  2. BroadcastReceiver的两种注册方式和使用

    1.静态注册,在minifest文件中 <receiver android:name=".BroadcastReceiverDemo" > <intent-fil ...

  3. Android 常用 adb 命令总结【转】

    原文链接 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中 ...

  4. Django开发笔记一

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.运行 python manage.py runser ...

  5. Software development skills for data scientists

    Software development skills for data scientists Data scientists often come from diverse backgrounds ...

  6. V4L2应用程序框架【转】

    转自:https://www.cnblogs.com/hzhida/archive/2012/05/29/2524397.html V4L2是V4L的升级版本,linux下视频设备程序提供了一套接口规 ...

  7. 没有备份怎么恢复被drop的表(利用undrop-for-innodb)

    介绍:     也许大家都难以理解,这么重要的数据为啥不备份(或者备份不可用)?而且还任性的drop table了.显然有备份是最好的,但是它们并不总是可用的.这种情况令人恐惧,但并非毫无希望.在许多 ...

  8. setfacl报错Operation not supported

    对文件目录setfacl权限设置时报错Operation not supported Google一下,发现是分区acl权限问题 一般情况下(ext4),默认acl支持都是加载的.但如果遇到二般情况, ...

  9. asp.net动态解析用户控件(UserControl)

    模块化的时候需要用到: #region asp.net解析用户控件 /// <summary> /// asp.net 解析用户控件 /// </summary> /// &l ...

  10. javaScript中自定义sort中的比较函数,用于比较字符串长度,数值大小

      , 1.2, 'bb', 'cc']; var len = arr.length; // for (var i = 0; i < len; i++) { // alert(arr + &qu ...