图论+回溯解QQ一笔画红包
[春节整活]
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一笔画红包的更多相关文章
- 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...
- qq划屏幕红包程序
qq划屏幕红包程序
- 图论--2-SAT--详解
问题描述: 现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x]AND A[y]=0.A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系. ...
- 图论-BFS解无权有向图最短路径距离
概述 本篇博客主要内容: 对广度优先搜索算法(Breadth-First-Search)进行介绍: 介绍用邻接表的存储结构实现一个图(附C++实现源代码): 介绍用BFS算法求解无权有向图(附C++实 ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- QQ18年,解密8亿月活的QQ后台服务接口隔离技术
作者:shane,腾讯后台开发高级工程师 QQ18年 1999年2月10日,腾讯QQ横空出世.光阴荏苒,那个在你屏幕右下角频频闪动的企鹅已经度过了18个年头.随着QQ一同成长的你,还记得它最初的摸样吗 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手—打开新的Image Acquisitio ...
- 支付宝AR实景红包上线不久即遭破解,官方已提高技术门槛
临近春节,阿里巴巴和腾讯的红包大战可谓下足功夫,上周支付宝推出了AR实景红包,该玩法基于"LBS+AR+红包"的方式,类似与今年火爆全球的AR手游Pekomon Go ,只不过这次 ...
随机推荐
- 写在LeetCode刷题600题
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 从2015年9月刷题至今,我终于在LeetCode刷够600道题了.从刚开始的Java语 ...
- 【LeetCode】554. Brick Wall 解题报告(Python)
[LeetCode]554. Brick Wall 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...
- 1298 - One Theorem, One Year
1298 - One Theorem, One Year PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- 第47篇-解释执行的Java方法调用native方法小实例
举个小实例,如下: public class TestJNI { static { // 程序在加载时,自动加载libdiaoyong.so库 System.loadLibrary("dia ...
- Histogram Processing
目录 HISTOGRAM EQUALIZATION 代码示例 HISTOGRAM MATCHING (SPECIFICATION) 其它 Gonzalez R. C. and Woods R. E. ...
- electron使用动态配置文件及持久化存储
1.如何在打包之后,把动态配置文件比如[config.json]放在根目录,不被打包到asar文件中 //解决思路,electron可以拷贝静态资源,比如你把config.json放在项目的根目录下, ...
- element 表格只展开一行(点击下一行上一行关闭)
源码:第一步 <el-table :data="tableData" border :row-class-name="tableRowClassName" ...
- 使用子查询获取,使用 all 关键字获取比所有“国内短线游”价格高的线路信息,按照线路类型、线路价格升序显示线路编号、线路名和价格
查看本章节 查看作业目录 需求说明: 使用子查询获取"国内短线游"及"国内长线游"的线路信息,按照线路类型.线路价格升序显示线路编号.线路名和价格 使用 all ...
- RazorEngine.NetCore 相见恨晚,它让我彻底放弃了T4模板
在dbfrist 时代,用T4模板生成代码,貌似还没有感觉到别扭.但是到了codefrist 后,我想要实体生成生成备注,我就得想方设法的去把备注弄到数据库,然后 还要处理模型中类型像枚举这种属性,渐 ...
- Linux-saltstack-3 saltstack的grains和pillar的基本使用
@ 目录 一.简介 二.grains 1.查看客户端所有的grains项 2.查看grains的所有的项和值 3.查看某个项和值 (1)语法1: (2)语法2: 4.根据grains来匹配目标主机 例 ...