详细分析见滑动解锁分析

AC代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 10 + 5;
int vis[maxn], ans, n, G[maxn][maxn], e[maxn][maxn];

struct edge{
	int x, y;
}a[maxn];

void init() {
	memset(G, 0, sizeof(G));
	for(int i = 1; i <= 7; i+=3)
		G[i][i+2] = G[i+2][i] = i+1;
	for(int i = 1; i <= 3; ++i)
		G[i][i+6] = G[i+6][i] = i+3;
	G[1][9] = G[9][1] = G[3][7] = G[7][3] = 5;
}

void dfs(int u, int cnt) {
	//is it possible
	for(int i = 0; i < n; ++i) {
		int x = a[i].x, y = a[i].y;
		if(vis[x] && vis[y] && !e[x][y] && !e[y][x]) return; //一条边的两个端点都被使用,但是这条边没使用则剪枝
	}

	int flag = 1;
	for(int i = 0; i < n; ++i) {
		if(!e[a[i].x][a[i].y] && !e[a[i].y][a[i].x]) {
			flag = 0;
			break;
		}
	}
	if(flag && cnt >= 4) ans++;
	for(int i = 1; i <= 9; ++i) {
		if(u != i && !vis[i] && vis[G[u][i]]) {
			vis[i] = e[u][i] = 1;
			dfs(i, cnt+1);
			vis[i] = e[u][i] = 0;
		}
	}
}

int main() {
	init();
	int T;
	scanf("%d", &T);
	while(T--) {
		scanf("%d", &n);
		for(int i = 0; i < n; ++i) scanf("%d%d", &a[i].x, &a[i].y);
		ans = 0;
		for(int i = 1; i <= 9; ++i) {
			memset(vis, 0, sizeof(vis));
			memset(e, 0, sizeof(e));
			vis[0] = vis[i] = 1;
			dfs(i, 1);
		}
		printf("%d\n", ans);
	}
	return 0;
}

如有不当之处欢迎指出!

hihocoder 1054 滑动解锁 dfs的更多相关文章

  1. hihocoder#1054 : 滑动解锁(深度优先搜索)

    描述 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上 ...

  2. hihoCoder#1054 滑动解锁

    原题地址 回溯搜索 对于每个待枚举的点,检查: 1. 度数检查:是否违反了出度入度限制.因为生成的路径除了首尾节点外,其他节点的出度和入度只能为2 2. 共线检查:是否违反了共线条件.即跨越了尚未枚举 ...

  3. hiho_1054_滑动解锁

    题目大意 智能手机九点屏幕滑动解锁,如果给出某些连接线段,求出经过所有给出线段的合法的滑动解锁手势的总数.题目链接: 滑动解锁 题目分析 首先,尝试求解没有给定线段情况下,所有合法的路径的总数.可以使 ...

  4. C语言 · 滑动解锁

    题目:滑动解锁 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图 ...

  5. java实现滑动解锁

    滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...

  6. Swift: 打造滑动解锁文字动画

    原文:Swift: 打造滑动解锁文字动画 最近木事,找出来玩了玩facebook的paper.到处都是那个"slide to unlock your phone"的效果啊.忽闪忽闪 ...

  7. Selenium模拟JQuery滑动解锁

    滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...

  8. jq实现简单的滑动解锁效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. APP九宫格滑动解锁的处理

    写手机自动化测试脚本关于APP九宫格滑动解锁方面采用了appium API 之 TouchAction 操作. 先是用uiautomatorviewer.bat查询APP元素坐标: 手工计算九宫格每个 ...

随机推荐

  1. Linux普通用户修改owner非本人文件为什么成功

    关键字:错误提示:E45 已设定选项’readonly’(请加!强制执行) Linux对文件和目录有很好的权限管理,但今天遇到一个比较诡异的事情,普通用户对文件权限不可写,但可以强制保存该文件,这样就 ...

  2. 如何更改wampserver的网站根目录

    我之前把网站根目录自定义为:D:/demo,现在想改为:D:www, 过程就是打开httpd.conf文件,搜索demo,然后把demo改为www,之后更改虚拟配置文件,记住D盘下一定要有www目录 ...

  3. .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消

    今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...

  4. The mkdir Command

    The mkdir command is is used to create new directories. A directory, referred to as a folder in some ...

  5. 面试中的Java链表

    链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...

  6. 关于Scanner类

    Scanner类 1.常用的两个方法:         public int nextInt():获取一个int类型的值         public String nextLine():获取一个St ...

  7. [C#] C# 与 MongoDB 的 CURD

    C# 与 MongoDB 的 CURD static void Main(string[] args) { //建立连接 var client = new MongoClient(); //建立数据库 ...

  8. iOS-Mac Charles抓包工具的使用【Mac 抓包工具Charles】

    1.下载文件 Charles安装包以及破解文件下载地址:http://charles.iiilab.com 2.安装及使用 使用介绍 http://www.cocoachina.com/ios/201 ...

  9. Java内存回收机制基础[转]

    原文链接:http://blog.jobbole.com/37273/ 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了J ...

  10. 洛谷 [P1169] [ZJOI2007] 最大的正方形

    本题是一道求最大子矩阵的题,可以使用悬线法来做,因为是相邻的01矩阵,所以需要对悬线法进行改动. #include <iostream> #include <cstdio> # ...