hihoCoder#1054 滑动解锁
2024-08-30 20:56:19
回溯搜索
对于每个待枚举的点,检查:
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 ;
}
最新文章
- 分别用ToolBar和自定义导航栏实现沉浸式状态栏
- python二进制相关
- REST vs SOAP
- Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)
- python 注意事项
- 20160725noip模拟赛&ldquo;Paodekuai&rdquo; alexandrali
- HDU3371--Connect the Cities(最小生成树)
- cdn是什么
- 做一个常规的banner图——负边距的使用、banner图的拼法
- php(三)使用thinkphp操作数据库
- 创建数组必须指定数组数目之new运算符避免这种限制
- 【转载】wifi的两种工作模式
- Day013--Python--内置函数一
- Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现!
- Gitblit 的安装使用
- How to transfer developer profile to one mac to another mac
- 【Android】详解Android动画
- centos-linux热拔插scsi硬盘
- jQuery基础(工具函数,浏览器信息,检测节点,字符串,$.extend())
- 【TP3.2】 动态切换数据库方法
热门文章
- 选择排序 分类: 算法 c/c++ 2014-10-10 20:32 509人阅读 评论(0) 收藏
- 在Eclipse+ADT中开发Android系统的内置应用
- 2016/10/29 Action类中execute方法的使用
- DotNteBar 控件操作
- 434 Number of Segments in a String 字符串中的单词数
- 转】R利剑NoSQL系列文章 之 Hive
- Laravel环境搭建
- windwsform登录页面
- HTML5 File API的应用
- Android(java)学习笔记191:ContentProvider使用之利用ContentProvider备份和还原手机短信(掌握)