[春节整活]

QQ的一笔画红包有几个特性:

1.最大为5×5的点阵,所以可以把每个点从左到右,从上到下标为1-25号点

2.每两个点只能存在一条线

3.线可以被盖住(例如连接2-1-3,2-1的线会被后来的1-3的连接线盖住),对肉眼观察很不利,但是对代码来说没有影响

解题思路:

1.对于线较多的点阵,可以使用邻接矩阵来画无向无权图(线较少可以使用邻接表),由于最大只有25个点,不必要考虑内存开销,所以直接使用邻接矩阵了

2.若某个节点所连接的线数为奇数,即为起点/终点,为偶数即为经过的点。若所有节点所连接的线数都为偶数,即首尾相连,任意点都可为起点/终点

3.使用回溯算法,找出将全部线只走一遍的方案,即为点阵的解

邻接矩阵代码如下:

/**
* 邻接矩阵
*/
public class DenseGraph {
// 节点数
private int n;
// 边数
private int m;
// 是否为有向图
private boolean directed;
// 图的具体数据
private boolean[][] g;
//记录节点的线数量
private int[] line;
//已连接数量
private int connected;
//换行专用
private int lineFeed; // 构造函数
public DenseGraph(){
n = 26;
m = 0;
directed = false;
// g初始化为n*n的布尔矩阵, 每一个g[i][j]均为false, 表示没有任和线
g = new boolean[n][n];
line=new int[n];
} //初始化点阵
private void initialization(){
//临时变量,保存每个节点连接节点的数量,以判断起点
int count=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (g[i][j]) {
count++;
}
}
line[i]=count;
count=0;
}
} // 返回节点个数
public int V(){ return n;}
// 返回边的个数
public int E(){ return m;} // 向图中添加一个边
public void addEdge( int v , int w ){
assert v >= 0 && v < n ;
assert w >= 0 && w < n ;
if( hasEdge( v , w ) )
return;
g[v][w] = true;
if( !directed )
g[w][v] = true;
m ++;
} // 验证图中是否有从v到w的边
boolean hasEdge( int v , int w ){
assert v >= 0 && v < n ;
assert w >= 0 && w < n ;
return g[v][w];
} //开始运行
public void start(){
//初始化
this.initialization();
//输出邻接矩阵
this.print();
//寻找起点
int qsd=-1;
for (int i = 0; i < line.length; i++) {
if (line[i]%2!=0){
qsd=i;
break;
}else if (line[i]!=0){
qsd=i;
}
}
//从起点开始回溯寻找路线
flashBack(qsd);
} public boolean flashBack(int a){
//如果已经走过的线数量等于总线数量,说明寻路完成
if (connected==m){
System.out.print("路线:["+a+"] -> ");
return true;
}else {
//遍历此点与全部节点的关系并按照以下执行
//1.如果两点之间有连接,假设此路线为正确路线,将此线改变为无连接,并开始从此点遍历
//2.如果最终无法走过全部线,则确定此路线不正确,回溯并将此线还原为连接,继续遍历
for (int i = 0; i < n; i++) {
if (g[a][i]){
g[a][i]=false;
g[i][a]=false;
connected++;
if (flashBack(i)){
lineFeed++;
if (lineFeed%20==0)
System.out.println();
System.out.print("["+a+"] -> ");
return true;
}else {
connected--;
g[a][i]=true;
g[i][a]=true;
}
}
}
return false;
}
} //输出邻接矩阵
public void print(){
System.out.println("边共:"+m+"条");
System.out.print("邻接矩阵 ");
for (int i = 1; i < n; i++) {
System.out.print(i+" \t");
}
System.out.println();
for (int i = 1; i < n; i++) {
System.out.print(i+" \t");
for (int j = 1; j < n; j++) {
System.out.print(g[i][j]+" \t");
}
System.out.println();
}
}
}

使用方法:

创建对象(new)

添加边(addEdge)

开始运行(start)

对于线非常多的图,一条一条添加线依然很麻烦,有没有更好的办法呢?

图论+回溯解QQ一笔画红包的更多相关文章

  1. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...

  2. qq划屏幕红包程序

    qq划屏幕红包程序  

  3. 图论--2-SAT--详解

    问题描述: 现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x]AND A[y]=0.A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系. ...

  4. 图论-BFS解无权有向图最短路径距离

    概述 本篇博客主要内容: 对广度优先搜索算法(Breadth-First-Search)进行介绍: 介绍用邻接表的存储结构实现一个图(附C++实现源代码): 介绍用BFS算法求解无权有向图(附C++实 ...

  5. [转] POJ图论入门

    最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...

  6. QQ18年,解密8亿月活的QQ后台服务接口隔离技术

    作者:shane,腾讯后台开发高级工程师 QQ18年 1999年2月10日,腾讯QQ横空出世.光阴荏苒,那个在你屏幕右下角频频闪动的企鹅已经度过了18个年头.随着QQ一同成长的你,还记得它最初的摸样吗 ...

  7. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  8. QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手—打开新的Image Acquisitio ...

  9. 支付宝AR实景红包上线不久即遭破解,官方已提高技术门槛

    临近春节,阿里巴巴和腾讯的红包大战可谓下足功夫,上周支付宝推出了AR实景红包,该玩法基于"LBS+AR+红包"的方式,类似与今年火爆全球的AR手游Pekomon Go ,只不过这次 ...

随机推荐

  1. 【LeetCode】78. Subsets 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 回溯法 日期 题目地址:https://leet ...

  2. 【LeetCode】319. Bulb Switcher 解题报告(Python)

    [LeetCode]319. Bulb Switcher 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/bulb ...

  3. 『学了就忘』vim编辑器基础 — 95、命令模式中的相关命令

    目录 1.移动光标操作 2.删除或剪切操作 3.复制操作 4.撤销操作 5.替换操作 6.补充一个知识点 命令模式中的命令主要取代的是Linux系统中鼠标的操作. vim编辑器的快捷键一般都集中在命令 ...

  4. 第十个知识点:RSA和强RSA问题有什么区别?

    第十个知识点:RSA和强RSA问题有什么区别 这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于 ...

  5. Vue.js高效前端开发 • 【Ant Design of Vue框架进阶】

    全部章节 >>>> 文章目录 一.栅格组件 1.栅格组件介绍 2.栅格组件使用 3.实践练习 二.输入组件 1.输入框组件使用 2.选择器组件使用 3.单选框组件使用 4.实践 ...

  6. Java_Swing中关于关闭窗口的方法

    注意:在继承Jframe的过程中,由于工具的快捷功能可以会继承到Frame类,继承到Jframe类打开的窗口默认是可以关闭的,而Frame类打开的窗口点了关闭的没有反应的. 1.关闭子窗口后,父窗口也 ...

  7. centos6.5-搭建Apache

    准备工作 1.关闭防火墙 service iptables stop 2.关闭selinux安全机制 setenforce 0 3.卸载rpm格式的httpd 这说明已经安装了rpm格式的软件包.所以 ...

  8. AP原理与最终一致性 强一致性 弱一致性

    转载自:http://www.blogjava.net/hello-yun/archive/2012/04/27/376744.html https://blog.csdn.net/c28905453 ...

  9. vue爬坑之路(webpack 配置篇)

    在vue cli下 1.npm run dev 打开浏览器在config的index.js中修改autoOpenBrowser为true 关闭sourcemap productionSourceMap ...

  10. Vulnhub系列:chili

    0x01 靶机信息 靶机:chili难度:简单下载:https://www.vulnhub.com/entry/chili-1,558/ 靶机描述: 0x02 信息收集 nmap扫描存活主机确定靶场i ...