题目:滑动解锁

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

所谓两个点“相邻”:当且仅当以这两个点为端点的线段上不存在尚未经过的点。

此外,许多手机都约定:这条折线还需要至少经过4个点。

为了描述方便,我们给这9个点从上到下、从左到右依次编号1-9。即如下排列:

1 2 3 4 5 6 7 8 9

那么1->2->3是非法的,因为长度不足。 1->3->2->4也是非法的,因为1->3穿过了尚未经过的点2。 2->4->1->3->6是合法的,因为1->3时点2已经被划过了。

某大神已经算出:一共有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等都是可能的方案。

你的任务是编写程序,根据已经瞥到的零碎线段,求可能解锁方案的数目。

输入: 每个测试数据第一行是一个整数N(0 <= N <= 8),代表小Hi看到的折线段数目。 以下N行每行包含两个整数 X 和 Y (1 <= X, Y <= 9),代表小Hi看到点X和点Y是直接相连的。

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

例如: 输入:

8

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

程序应该输出: 2

再例如: 输入:

4

2 4

2 5

8 5

8 6

程序应该输出: 258

资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 java选手注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。 java选手注意:主类的名字必须是:Main,否则按无效代码处理。

c/c++选手注意: main函数需要返回0 c/c++选手注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 c/c++选手注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

注释:思路:直接dfs,需要注意的是去除掉不可行的方法,如1->3就是不可行,因为2之前没有被划到过,因此我创建了isOK函数判断最近选取的两点是否可行,dig数组中[i][j]中j=2时,代表不可行的数值,f数组代表之前这个数是否已经被划中。

 /*
测试数据:
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int n;//看到的折线段数目
int path[][];//表看到的片段
int ans=;
bool use[];//标记该位置是否滑过
int hefa(int a,int b){
//枚举出8个非法集合
int feifa[][]={{,,},{,,},{,,},{,,},{,,},{,,},{,,},{,,}};
for(int i=;i<;i++){
if((a==feifa[i][] && b==feifa[i][]) || (a==feifa[i][] && b==feifa[i][])){
if(!feifa[i][]){
return ;
}
}
}
return ;
}
void dfs(int number,int begin,int press[]){
//若已经选中2个数字了,判断刚刚选中的两个数字是否合法
if(begin >= ){
int a = press[begin-];
int b = press[begin-];
if(!hefa(a,b)){
return;
}
}
/*表已经选中的数字达到需要选择的数量(number);
与已看到的片段比较,若刚选中的片段存在于已看到的片段数组中,则继续,否则返回。
*/
if(begin==number){
for(int i=;i<n;i++){
int a = path[i][];
int b = path[i][];
for(int j=;j<=begin-;j++){
if((a==press[j] && b==press[j+]) || (b==press[j] && a==press[j+])){
break;
}
if(j==begin-)
return;
}
}
ans++;
return;
}
else if(begin>number){//选多了
return;
}
//dfs主体
for(int i=;i<=;i++){
if(!use[i]){
use[i] = true;
press[begin] = i;
dfs(number,begin+,press);//搜索下一个
use[i] = false;
}
}
}
int main(){
memset(use,false,sizeof(use));
scanf("%d",&n);
getchar();//处理回车
int press[]={};//存放当前划中数字的数组
for(int i=;i<n;i++){
scanf("%d%d",&path[i][],&path[i][]);
}
for(int i=n>?n:; i<=; i++){
/*参数含义:
i:划中得数字;
0:begin:划得位置,选到第几个了;
press:存放当前划中数字的数组 .
*/
dfs(i,,press);
}
printf("%d",ans);
return ;
}

C语言 · 滑动解锁的更多相关文章

  1. java实现滑动解锁

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

  2. hiho_1054_滑动解锁

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

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

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

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

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

  5. Selenium模拟JQuery滑动解锁

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

  6. hihocoder 1054 滑动解锁 dfs

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

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

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

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

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

  9. 【转】Selenium模拟JQuery滑动解锁

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

随机推荐

  1. IE8 兼容性总结

    rgba 颜色格式 IE8 不支持 rgba(0, 0, 0, .5) 这种颜色格式. 解决方案:可以利用一张半透明的 png 图片来兼容 IE8. flexbox 根据 caniuse 给出的数据, ...

  2. [MongoDB] MongoDB管理:使用killOp干掉Long Running Operation

    http://www.mongoing.com/archives/2563 MongoDB提供了killOp请求,用于干掉运行时间很长的请求,killOp通常需要与currentOp组合起来使用:先根 ...

  3. 错误解决记录------------mysql连接本地数据库显示"can't get hostname for your address"

    mysql连接本地数据库遇到 can't get hostname for your address 不明原因的本地mysql数据库连接不上,总是显示can't get hostname for yo ...

  4. python 数据类型元组与字典内置方法

    1.元组 (1)元组是不可变的列表,能存多个值:如果多个值只有取得需求,没有改的需求,用元组最合理 (2)定义:在()内用逗号隔开,可以存任意类型的值 注意:当元组只有一个元素时,要在后面加逗号 # ...

  5. AIX使用命令修改网卡IP地址,永久生效

    比如修改en0的ip地址.chdev -l en0 -a netaddr=192.168.1.100 -a netmask=255.255.255.0 -a state=up 启用en0 网卡ifco ...

  6. 小甲鱼Python第十一讲课后习题

    0. 注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案. old = [1, 2, 3, 4, 5]new = oldold = [6]print(new) 如果不上机操作,你觉得会 ...

  7. Linux之临时配置网络(ip,网关,dns)+永久配置

    作业一:临时配置网络(ip,网关,dns)+永久配置 配置网络信息 [root@localhost ~]# ifconfig eno16777736: flags=4163<UP,BROADCA ...

  8. pip的基本使用

    pip的基本使用 1.pip简介 pip 是一个现代的,通用的 Python 包管理工具.提供了对 Python 包的查找.下载.安装.卸载的功能 pip是官方推荐的安装和管理Python包的工具,用 ...

  9. Python常用的软件包

    下面是Python开发常用的软件包. 名称 用途 安装命令 opengl   sudo pip3 install PyOpenGL  pyqtgraph GUI图形库 sudo pip3 instal ...

  10. 毕业论文Word格式技巧

    word利用多级列表功能实现章节标题自动编号 坑:在选择级别1后,直接在当前对话框直接继续设置级别2:然后选中级别2,设置相应的格式,主要在将级别链接到样式处选择为标题2,然后要在库中显示的级别选择级 ...