图论+回溯解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】6. ZigZag Conversion Z 字形变换
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字形变换,ZigZag,题解,Leetcode, 力扣,P ...
- codeforce A. 2Char(水题,暴力)
今晚发了个蛇精病,然后CF了,第一题这好难啊,然而水题一个,暴力飘过. 链接http://codeforces.com/contest/593/problem/A: 题意比较难懂吗?傻逼百度都翻译不对 ...
- 1307 - Counting Triangles
1307 - Counting Triangles PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...
- 手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏01游戏窗口
项目源码 项目源码 游戏配置信息类 Config.java 没什么解释的. package config; public class Config { public final static Stri ...
- rapidjson解析与构造实例
void rapidjson1(){ rapidjson::StringBuffer s; rapidjson::Writer<rapidjson::StringBuffer> write ...
- [opencv]drawContours 示例
vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(img_canny,co ...
- Linux的基本目录结构
- <数据结构>XDOJ316.多点测试的写法
问题与解答 问题描述 有一棵无限大的完全二叉树,该二叉树自上而下.自左而右从1开始编号.从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从5到根结点的路径是(5, 2, 1),从4到根结 ...
- Android 悬浮窗
悬浮窗是一种比较常见的需求.例如把视频通话界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情. 本文给出一个简单的悬浮窗实现.可缩小activity和还原大小.可悬浮在其他activity上.使用 ...
- django在创建用户时设置一个默认的密码
1. 在settings.py文件中定义初始密码 2. 在signal.py文件中密码加密时导入settings中的配置 去查看数据库密码已加密 来自为知笔记(Wiz)