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

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

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

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

2 3

5 6

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是直接相连的。

输出:

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

例如:

输入:

1 2

3

4

5

6

7

8

9

程序应该输出:

再例如:

输入:

2 4

5

5

6

程序应该输出:

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 1000ms

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

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

java选手注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

java选手注意:主类的名字必须是:Main,否则按无效代码处理。

c/c++选手注意: main函数需要返回0

c/c++选手注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

c/c++选手注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

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

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner; public class Main {
public static ArrayList<Integer> list = new ArrayList<Integer>();
public static int count = 0; //代表输入折线中所含顶点最少数目
public static int result = 0; //最终输出结果
public static int[][] judgeMid = new int[10][10]; //填写两点之间有中间节点的情形 public boolean check1() { //判断当前路径是否符合行走规则
boolean[] used = new boolean[10];
for(int i = 0;i < 10;i++)
used[i] = false;
for(int i = 0;i < list.size() - 1;i++) {
used[list.get(i)] = true;
int now = list.get(i);
int next = list.get(i + 1);
if(judgeMid[now][next] != 0) {
int mid = judgeMid[now][next];
if(used[mid] == true)
continue;
else
return false;
}
}
return true;
} public boolean check2(int[][] edge) { //判断当前路径是否包含题意所输入折线边
if(list.size() >= count && check1()) {
for(int i = 0;i < edge.length;i++) {
if(list.contains(edge[i][0]) && list.contains(edge[i][1])) {
int a = list.indexOf(edge[i][0]);
int b = list.indexOf(edge[i][1]);
if(Math.abs(a - b) == 1)
continue;
else
return false;
} else {
return false;
}
}
return true;
}
return false;
} public void dfs(int[][] edge, int step) {
if(step == 9) {
return;
} else {
for(int i = 1;i < 10;i++) {
if(list.contains(i))
continue;
list.add(i);
if(check2(edge)) {
result++;
}
dfs(edge, step + 1);
list.remove(list.size() - 1);
}
}
return;
} public static void main(String[] args) {
judgeMid[1][3] = judgeMid[3][1] = 2;
judgeMid[1][7] = judgeMid[7][1] = 6;
judgeMid[1][9] = judgeMid[9][1] = 5;
judgeMid[2][8] = judgeMid[8][2] = 5;
judgeMid[3][7] = judgeMid[7][3] = 5;
judgeMid[3][9] = judgeMid[9][3] = 6;
judgeMid[4][6] = judgeMid[6][4] = 5;
judgeMid[7][9] = judgeMid[9][7] = 8; Main test = new Main();
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[][] edge = new int[N][2];
HashSet<Integer> set = new HashSet<Integer>();
for(int i = 0;i < N;i++) {
int a = in.nextInt();
int b = in.nextInt();
set.add(a);
set.add(b);
edge[i][0] = a;
edge[i][1] = b;
}
count = set.size();
test.dfs(edge, 0);
System.out.println(result);
}
}

java实现滑动解锁的更多相关文章

  1. C语言 · 滑动解锁

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

  2. selenium 模拟滑动解锁

    来源:Selenium模拟JQuery滑动解锁   (selenium +Python ) 本文:selenium+Java package cn.gloryroad; import org.open ...

  3. hiho_1054_滑动解锁

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

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

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

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

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

  6. Selenium模拟JQuery滑动解锁

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

  7. hihocoder 1054 滑动解锁 dfs

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

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

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

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

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

随机推荐

  1. Vue中跨域问题解决方案1

    我们需要配置代理.代理可以解决的原因:因为客户端请求服务端的数据是存在跨域问题的,而服务器和服务器之间可以相互请求数据,是没有跨域的概念(如果服务器没有设置禁止跨域的权限问题),也就是说,我们可以配置 ...

  2. 高通Vuforia(Unity3D)云识别初级使用教程

    高通Vuforia(Unity3D)云识别初级使用教程   最近因项目开发需要,接触了高通的AR引擎Vuforia云识别,个人感觉稳定性还是很不错的,唯一不爽的地方就是免费的云识别库每个月只能识别10 ...

  3. javaweb学习之路(3)Cookie

    1.Cookies的原理 1)首先浏览器向服务器发出请求. 2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内. 3)然后把该Cookie对象放在响应头,一并发送回浏览器. 4) ...

  4. java ->IO流_字符流

    字符流 经过前面的学习,我们基本掌握的文件的读写操作,在操作过程中字节流可以操作所有数据,可是当我们操作的文件中有中文字符,并且需要对中文字符做出处理时怎么办呢? 字节流读取字符的问题 通过以下程序读 ...

  5. 2018-06-18 sublime代码编辑器

    sublime代码编辑器:主流前端开发编辑器,体积较小,运行速度快,文本功能强大,支持VI扩展,linux下面有个自带的文本编辑神器,名字叫做:vi ,熟练vi模式可以大量减少使用鼠标的次数,从而增加 ...

  6. lodash入门

    简介 Lodash是一个著名的javascript原生库,不需要引入其他第三方依赖.是一个意在提高开发者效率,提高JS原生方法性能的JS库.简单的说就是,很多方法lodash已经帮你写好了,直接调用就 ...

  7. centos7 git下载速度慢

    nslookup命令 yum -y install bind-utils [root@iZ1i4qd6oynml0Z ~]# nslookup github.global.ssl.fastly.Net ...

  8. 2.2 Go变量类型

    内置类型 值类型: bool 布尔类型 int(32 or 64), int8, int16, int32, int64 整数类型 uint(32 or 64), uint8(byte), uint1 ...

  9. 每次找Internet选项感到抓狂?一键打开!

    WIN+R运行,输入inetcpl.cpl,就可以打开了!

  10. 安卓网络编程学习(1)——java原生网络编程(1)

    写在前面 马上要进行第二轮冲刺,考虑到自己的APP在第一轮冲刺的效果不尽人意,有很多网络方面的小BUG,这里就系统学习一下网络编程,了解来龙去脉,以便更好的对项目进行优化处理. http协议 http ...