图论+回溯解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】260. Single Number III 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 题目地址:https://leet ...
- LeetCode 第三大的数414. Third Maximum Number
题目 描述:给定数组中求第三大的数字:如果没有,返回最大的:时间复杂度O(n) 记得<剑指offer>才看到过这样的求第k大的题目.但是忘记具体怎么做了.只好先自己想了. 因为时间复杂度的 ...
- GCD (hdu 5726)
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- King's Order(hdu5642)
King's Order Accepts: 381 Submissions: 1361 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 'real'词频分析
写下来想法来自于无聊时写的代码.https://cryptopals.com/sets/1/challenges/3 The hex encoded string: 1b37373331363f781 ...
- MySQL基础操作指南
启动停止MySQL服务 1.Windows服务窗口启动:开始 → 运行 → services.msc → 找到MySQL 56服务 2.MySQL命令启动:开始 → 运行 → 管理员权限运行cmd → ...
- redis-ha手动切换slave节点为master
仅做个人记录,请慎重参考!! 问题描述:使用redis-ha启动了3个pod,现在还有一个pod正常运行,并且为slave(理论上第一个起来的pod应该为master) 通过info命令查看下图 尝试 ...
- Python_PyYaml模块的使用
YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表示结构. 模块安装 pip install pyyaml # 如果是py2,使用 pip install yaml P ...
- 基于ShardingJDBC的分库分表详细整理
转载 https://www.cnblogs.com/jackion5/p/13658615.html 前言 传统应用项目设计通常都是采用单一数据库作为存储方案,但是随着互联网的迅猛发展以及应用数据量 ...
- etcd的raft选取机制
etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠, ...