hihoCoder#1054 滑动解锁
回溯搜索
对于每个待枚举的点,检查:
1. 度数检查:是否违反了出度入度限制。因为生成的路径除了首尾节点外,其他节点的出度和入度只能为2
2. 共线检查:是否违反了共线条件。即跨越了尚未枚举过的节点
对于枚举产生的路径,检查:
1. 长度检查:长度是否大于等于4
2. 完整性检查:是否包含了片段中出现的所有边
代码:
#include <iostream>
#include <cstring> using namespace std; int impossible[]; bool integrity_check(int piece[][], int path[][]) {
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
if (piece[i][j] && !path[i][j])
return false;
return true;
} bool degree_check(int piece[][], int path[][], int b, int e) {
if (piece[b][e])
return true; int bdegree = ;
int edegree = ; for (int i = ; i < ; i++) {
bdegree += path[b][i] || piece[b][i] ? : ;
edegree += path[e][i] || piece[e][i] ? : ;
} return bdegree < && edegree < ;
} bool collineation_check(int visited[], int b, int e) {
int t = (b + ) * + e + ;
return impossible[t] < || visited[impossible[t] - ];
} bool check(int piece[][], int path[][], int visited[], int b, int e) {
if (visited[e])
return false; return degree_check(piece, path, b, e) && collineation_check(visited, b, e);
} int search(int piece[][], int path[][], int visited[], int p, int len) {
int res = ; if (len >= && integrity_check(piece, path))
res++; for (int i = ; i < && len < ; i++) {
if (check(piece, path, visited, p, i)) {
visited[i] = ;
path[p][i] = path[i][p] = ;
res += search(piece, path, visited, i, len + );
path[p][i] = path[i][p] = ;
visited[i] = ;
}
} return res;
} int main() {
int T;
memset(impossible, -, sizeof(int) * );
impossible[] = ;
impossible[] = ;
impossible[] = ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ; cin >> T;
while (T--) {
int N;
int piece[][] = {{, }};
int path[][] = {{, }};
int visited[] = {};
int res = ; cin >> N;
for (int i = ; i < N; i++) {
int a, b;
cin >> a >> b;
piece[a - ][b - ] = piece[b - ][a - ] = ;
} for (int i = ; i < ; i++) {
visited[i] = ;
res += search(piece, path, visited, i, );
visited[i] = ;
} cout << res << endl;
}
return ;
}
hihoCoder#1054 滑动解锁的更多相关文章
- hihocoder#1054 : 滑动解锁(深度优先搜索)
描述 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上 ...
- hihocoder 1054 滑动解锁 dfs
详细分析见滑动解锁分析 AC代码 #include <cstdio> #include <cmath> #include <cctype> #include < ...
- hiho_1054_滑动解锁
题目大意 智能手机九点屏幕滑动解锁,如果给出某些连接线段,求出经过所有给出线段的合法的滑动解锁手势的总数.题目链接: 滑动解锁 题目分析 首先,尝试求解没有给定线段情况下,所有合法的路径的总数.可以使 ...
- Swift: 打造滑动解锁文字动画
原文:Swift: 打造滑动解锁文字动画 最近木事,找出来玩了玩facebook的paper.到处都是那个"slide to unlock your phone"的效果啊.忽闪忽闪 ...
- Selenium模拟JQuery滑动解锁
滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...
- C语言 · 滑动解锁
题目:滑动解锁 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图 ...
- jq实现简单的滑动解锁效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- APP九宫格滑动解锁的处理
写手机自动化测试脚本关于APP九宫格滑动解锁方面采用了appium API 之 TouchAction 操作. 先是用uiautomatorviewer.bat查询APP元素坐标: 手工计算九宫格每个 ...
- 【转】Selenium模拟JQuery滑动解锁
滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...
随机推荐
- Oracle11g导出dmp并导入Oracle10g的操作记录
Oracle11g导出dmp并导入Oracle10g的操作记录. 操作环境说明: Oracle11g环境:Windows7,Oracle Database 11g Enterprise Edition ...
- 221 Maximal Square 最大正方形
在一个由0和1组成的二维矩阵内,寻找只包含1的最大正方形,并返回其面积.例如,给出如下矩阵:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0返回 4. 详见:https://l ...
- E. Dasha and Puzzle 数学题
http://codeforces.com/contest/761/problem/E 给出一颗树,要求在坐标系中用平行于坐标轴的线描绘出来. 要求边不能相交,而且点的坐标唯一. 注意到2^1 + 2 ...
- 基于CentOS6.5下如何正确安装和使用Tcpreplay来重放数据(图文详解)
前期博客 基于CentOS6.5下snort+barnyard2+base的入侵检测系统的搭建(图文详解)(博主推荐) tcpreplay是什么? 简单的说, tcpreplay是一种pcap包的重放 ...
- GIS在石油行业中的应用
在石油工业中,发现新的石油资源,取得竞争优势,是成功的关键之一.GIS系统能帮助评估潜在的石油资源,及时.准确.直观地定位油气资源的空间分布及其特征,以正确有效地开展部署勘探开发工作,占领市场先机. ...
- iOS - 事件处理全过程(补充)
事件处理的完整过程 1> 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件. 2> 调用最合适控件的touches….方法 3> 如果调用了[supe ...
- ES6特性的两点分析
块级作用域声明let.constES6中const 和let的功能,转换为ES5之后,我们会发现实质就是在块级作用改变一下变量名,使之与外层不同.ES6转换前: let a1 = 1; let a2 ...
- linux crontab创建计划任务
1.编辑计划任务 编辑crontab文件 crontab -e 2.查看计划任务日志 查看crontab日志 tail -100f /var/log/cron 3.创建计划任务格式 (1)基本格式 : ...
- AttributeError: 'list' object has no attribute 'extends' && list详解
拼写错误 是extend 而不是extends 出错demo: In [27]: c = [2,3] In [28]: c.extends([5]) ------------------------ ...
- 01Oracle Database
Oracle Database Oracle Database又名Oracle RDBMS简称Oracle是甲骨文公司的一款关系数据库管理系统. Oracle Website.