图论+回溯解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】190. Reverse Bits 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 二进制字符串翻转 位运算 日期 题目地址:https://le ...
- 【LeetCode】33. Search in Rotated Sorted Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 1119 机器人走方格 V2
1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mo ...
- anaconda 安装 torchvision
conda install torchvision -c soumith 参考: pytorch--torchvision安装_tyl15827311279的博客-CSDN博客_torchvision ...
- 《Head First设计模式》读书笔记
前言:本文是记录我在阅读<Head First设计模式>这本书时,做得相关笔记,相关示例代码地址:design-patterns.由于本书不是将设计原则和设计模式分开讲述的,而是在讲一个设 ...
- 编写Java程序,现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示
查看本章节 查看作业目录 需求说明: 现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示 实现思路: 创建解析 XML 文档类 ParseXML 和窗体类 ...
- 「物流跟踪管理系统」 · Java Swing + MySQL JDBC开发,美和易思结业考试机试试题
目录 文档说明: 一.语言和环境 二.技术要求 三.功能要求 四.数据库设计 五.具体要求及推荐实现步骤 六.注意事项 实现代码: 一.数据库 二.Java Swing com.ynavc.Bean ...
- AVD Pixel_2_API_30 is already running. lf that is not the case, delete the files at
AVD Pixel_2_API_30 is already running. lf that is not the case, delete the files at C:\Users\Adminis ...
- 编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面
返回本章节 返回作业目录 需求说明: 使用Swing布局管理器与常用控件,实现用户登录界面 实现思路: 创建用户登录界面的类LoginFrame,在该类中创建无参数的构造方法,在构造方法中,设置窗体大 ...
- 【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式
背景: 在做前后端分离时,牵扯到跨域,但是已经设置了跨域 前端设置了允许携带Cookie axios.defaults.withCredentials = true; 后端也配置了跨域 浏览器端查看发 ...