描述

滑动解锁是智能手机一项常用的功能。你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点。这些划过的点所组成的有向折线,如果与预设的折线在图案、方向上都一致,那么手机将解锁。两个点相邻当且仅当以这两个点为端点的线段上不存在尚未经过的点。此外,这条折线还需要至少经过4个点。

为了描述方便,我们给这9个点从上到下、从左到右依次编号1-9。那么1->2->3是不合法的,因为长度不足。1->3->2->4也是合不法的,因为1->3穿过了尚未经过的点2。2->4->1->3->6是合法的,因为1->3时点2已经被划过了。

作为一个爱逛知乎的好少年,小Hi已经知道一共有389112种不同的解锁方案。不过小Hi不满足于此,他希望知道,当已经瞥视到一部分折线的情况下,有多少种不同的方案。

遗憾的是,小Hi看到的部分折线既不一定是连续的,也不知道方向。例如看到1-2-3和4-5-6,那么1->2->3->4->5->6,1->2->3->6->5->4, 3->2->1->6->5->4->8->9等都是合法的方案。

输入

第一行包含一个整数T(1 <= T <= 10),代表测试数据组数。

每个测试数据第一行是一个整数N(0 <= N <= 8),代表小Hi看到的折线段数目。

以下N行每行包含两个整数X, Y (1 <= X, Y <= 9),代表小Hi看到点X和点Y是直接相连的。

输出

对于每组数据输出合法的方案数目。

样例输入

3
0
8
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
4
2 4
2 5
8 5
8 6

样例输出

389112
2
258

方法是利用深度优先搜索尝试所有可能,并累计符合的方案数,感觉效率很低啊,难道题目就是这样的意图?
 #include<stdio.h>
#include<iostream>
#include<cstring> using namespace std; int test[][],vis[],depth,aim_depth,n,res,es[][]; int valid(int x,int y)
{
if((test[x][y]||test[y][x])&&!vis[(x+y)/])
{
return ;
}
return ;
} void dfs(int x,int depth,int e)
{
vis[x]=;
if(depth==aim_depth&&e==n)
{
++res;
return;
} for(int i=;i<;++i)
{
if(!vis[i])
{
if(!valid(x,i))
{
continue;
}
if(es[x][i])
{
dfs(i,depth+,e+);
}
else
{
dfs(i,depth+,e);
}
vis[i]=;
}
}
} int main()
{
memset(test,,sizeof(test));
test[][]=test[][]=test[][]=test[][]=;
test[][]=test[][]=test[][]=test[][]=;
test[][]=test[][]=test[][]=test[][]=;
test[][]=test[][]=test[][]=test[][]=; int k,m,i,j;
scanf("%d",&k);
for(i=;i<=k;i++)
{
res=;
memset(vis,,sizeof(vis));
memset(es,,sizeof(es)); cin>>n; if(n==)
{
cout<<<<endl;
continue;
} for(j=;j<n;++j)
{
int a,b;
cin>>a>>b;
es[a][b]=es[b][a]=;
} aim_depth=max(,n+); for(;aim_depth<;++aim_depth)
{
for(j=;j<;++j)
{
dfs(j,,);
vis[j]=;
}
}
cout<<res<<endl; }
return ;
}

hihocoder#1054 : 滑动解锁(深度优先搜索)的更多相关文章

  1. hihocoder 1054 滑动解锁 dfs

    详细分析见滑动解锁分析 AC代码 #include <cstdio> #include <cmath> #include <cctype> #include < ...

  2. hihoCoder#1054 滑动解锁

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

  3. hiho_1054_滑动解锁

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

  4. C语言 · 滑动解锁

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

  5. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  6. 初涉深度优先搜索--Java学习笔记(二)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...

  7. 挑战程序2.1.4 穷竭搜索>>深度优先搜索

      深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386  思路:(⊙v⊙)嗯  和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...

  8. 回溯 DFS 深度优先搜索[待更新]

      首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权!   1.概念   回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...

  9. 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

    广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...

随机推荐

  1. Microsoft Script Editor

    目前,常用的浏览器IE.Chrome.Firefox都有相应的脚本调试功能.作为我们.NET 阵营,学会如何在IE中调试JS就足够了,在掌握了IE中的调试方法以后,Chrome和Firefox中的调试 ...

  2. 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能

    相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domai ...

  3. android程序逆向工程

    随着智能手机的普及,功能越来越强大.程序也越来多和复杂化.研究一下android系统的逆向工程也是挺有意思的. 目前android逆向工程还处于初级阶段.表现在于: 1.没有完整的动态调试程序.目前由 ...

  4. Why the framework uses ruby instead of perl?[转]

    During the development of the framework, the one recurring question that the Metasploit staff was co ...

  5. 好记心不如烂笔头之jQuery学习,第一章

    jQuery对象和DOM对象的转换: 1.jquery对象是对象数组,于是乎: var $cr = $('#cr'); var cr = $cr[0]; 2.使用jquery的自带函数: var $c ...

  6. 云服务器 ECS Linux 误删除文件恢复方法介绍

    云服务器 ECS Linux 下,rm -rf  意味着一旦删除的文件是无法挽回的.但如果在没有文件覆盖操作的前提下,可以先尝试相关方式进行文件恢复. 本文对此进行简要说明. https://help ...

  7. 终端I/O之波特率函数

    波特率(baud rate)是一个以往采用的术语,现在它指的是"位/秒"(bits per second).虽然大多数终端设备对输入和输出使用同一波特率,但是只要硬件许可,可以将它 ...

  8. 基于sqlite的Qt 数据库封装

    [代码] mydata.h 10 #ifndef MYDATA_H 11 #define MYDATA_H 12 #include <QObject> 13 #include <QS ...

  9. 代码片段 - JavaScript 求时间差

    // 求时间差1(时间差不能超过一天) function timeDifference1(startTime, endTime) { let times = endTime.getTime() - s ...

  10. 关于composer

    Composer PHP依赖管理的新时代http://segmentfault.com/a/1190000000353129 Composer 的主页   https://getcomposer.or ...