手机9宫格图案解锁方法总数计算

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

有些人可能有和我一样的疑问,在这小小的9个点中,图案密码总共有多少种形式呢?今天我就使用深度优先搜索的方法解决这个问题。具体c++代码如下:

#include<iostream>
using namespace std;

int isvisit[10]={0};//表示当前该点是否在路径中
int noPath[8][3]={{1,3,2},{4,6,5},{7,9,8},{1,7,4},{2,8,5},{3,9,6},{1,9,5},{3,7,5}};//每项的三个数字{a,b,c}表示:当点c未在路径上时,<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">点a和点b不能直接相连</span>
int j,k;
int hasPath(int start,int end)//判断此时两点是否可以直接相连
{
	for(j=0;j<8;j++)
	{
		if( (start==noPath[j][0]&&end==noPath[j][1]) || (start==noPath[j][1]&&end==noPath[j][0]) )
		{
			if(isvisit[ noPath[j][2] ])<span style="white-space:pre">	</span>//表示点c已经在路径上,a和b直接可以直接连接
				return 1;
			else return 0;
		}
	}
	return 1;
}

int dfs(int start,int length)
{
	int count = 0;
	isvisit[start]=1;
	int i;
	for(i=1;i<10;i++)<span style="white-space:pre">	</span>//遍历所有为访问的点
	{
		if(i==start || isvisit[i])
			continue;
		if(hasPath(start,i))
		{
			count += dfs(i,length+1);<span style="white-space:pre">	</span>//递归搜索
		}
	}
	isvisit[start]=0;
	if(length>=4)<span style="white-space:pre">		</span>//如果路径长度超过4,则该路径符合要求
		count++;

	return count;
}
int main()
{
	int result=0;
	for(k=1;k<10;k++)<span style="white-space:pre">	</span>//分别从9个点开始dfs,为提升效率,此处可以根据对称原则减少不必要的运算
		result+=dfs(k,1);
	cout << result << endl;
	return 0;
}

运算结果为:389112

时间: 2024-10-16 09:18:47

手机9宫格图案解锁方法总数计算的相关文章

Python3网络爬虫实战-45、微博宫格验证码的识别

本节我们来介绍一下新浪微博宫格验证码的识别,此验证码是一种新型交互式验证码,每个宫格之间会有一条指示连线,指示了我们应该的滑动轨迹,我们需要按照滑动轨迹依次从起始宫格一直滑动到终止宫格才可以完成验证,如图 8-24 所示: 图 8-24 验证码示例 鼠标滑动后的轨迹会以×××的连线来标识,如图 8-25 所示: 图 8-25 滑动过程 我们可以访问新浪微博移动版登录页面就可以看到如上验证码,链接为:https://passport.weibo.cn/signin/login,当然也不是每次都会出

关于三星手机SPH-D710图案解锁过多导致手机锁死的问题

前一段时间由于手机充电被小孩子玩,导致屏幕锁死的状态,然后出现要用谷歌帐户来解屏,但是试了后还是不行,不是很懂这些东西,以为坏了.最后到网上查了查,说要重新刷机什么的,权威的方法就是要恢复出厂设置,于是在网上找了一些方法试,最后就可以了. 首先按住手机的音量加和HOME键还要按住关机键(要保证你的手机处于关机状态),然后就会出现很多行英文模式,用音量键选择第一个WIPE开头的,按开关机键确认,会出现很多个no,但是只有一个yes,用音量键选择那个yes,再按home键确认:再选择第二个wipe开

一个全等四宫格实现的多种方法

方法一:用float方法实现 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>一个全等四宫格的实现</title> <style> .parent{ background-color:#fff; width: 500px; height: 400px; margin-left: -10px; margin-top: -10px;

Android自定义多宫格解锁控件

在此之前,一直在想九宫格的实现方法,经过一个上午的初步研究终于完成了一个简单的N*N的宫格解锁组件,代码略显粗糙,仅仅做到简单的实现,界面等后期在做优化,纯粹是学习的目的,在算法上有点缺陷,如果有错误或者更好的方法,欢迎提出,相互学习.先来看一下预览图 九宫格效果展示 N=3 手指抬起 N=4 手指没有抬起 其他的废话不多说了,直接开始吧..... 实现步骤 设置声明属性attrs.xml文件 创建SeniorPoint.java文件 创建View并重写其中的几个重要方法 设置触摸事件,并进行数

安卓项目开发实战(2)--星座展示12宫格

好多日子没有写安卓了,今天继续我未完成的安卓项目.今天主要实现星座展示的12宫格效果. 1.星座图片 找好12星座的图片,参见工程代码下面的res/drawable目录 2.星座枚举类 建立这个枚举类是很有必要的,可以使我们 的代码更加清晰,同时避免了魔法数字的情况. 枚举类的代码如下: package com.liuc.constatntEnum; import com.liuc.R; /** * 星座枚举 * * @author Administrator * */ public enum

9宫格拼图

选张图片做成9宫格拼图 今天要学习一个拼图项目. 目标是传入一张图片,然后将它分成9份,去掉一份,鼠标点击进行拼图. 源文件结构很简单 第一步.新建项目 这一步没什么好说的,新建一个项目就跟源文件结构一样了 第二步.页面布局(.xaml文件) 看下源文件 控件有 DockPanel Grid Button三个然后设置了Grid有三列和三行.DockPannel暂时不知道有什么用,所以我先不忙加.然后我就报错了 原来 xaml是用的xml格式.button外面没有双标签包围,不能识别,所以报错.所

oracle 用户被锁定解锁方法

修改了用户密码,第二天过来发现用户被锁定,晚上走的时候还好好的 . alter profile DEFAULT limit FAILED_LOGIN_ATTEMPTS UNLIMITED; alter user xxxx account unlock; ok! --1.--系统参数配置 connect sys/[email protected]_link as sysdba select * from dba_profiles where resource_name like 'FAILED_L

一个iOS图片选择器的DEMO(实现图片添加,宫格排列,图片长按删除,以及图片替换等功能)

在开发中,经常用到选择多张图片进行上传或作其他处理等等,以下DEMO满足了此功能中的大部分功能,可直接使用到项目中. 主要功能如下: 1,图片九宫格排列(可自动设置) 2,图片长按抖动(仿苹果软件删除时,图标抖动效果),可进入删除状态,再次单击进入普通状态 3,图片设置最大上限,加号按钮自动隐藏 4,已选图片可单击进行重新选择 5,无需代理,直接调用对应属性就可获取所有图片,并与显示顺序保持一致 效果图如下: 1 // 2 // SZAddImage.h 3 // addImage 4 // 5

MUI组价五:开关、底部选项卡、9宫格和分页

1.switch(开关) mui提供了开关控件,点击滑动两种手势都可以对开关控件进行操作,UI如下:默认开关控件,带on/off文字提示,打开时为绿色背景,基本class类为.mui-switch..mui-switch-handle,DOM结构如下: <div class="mui-switch"> <div class="mui-switch-handle"></div> </div> 若希望开关默认为打开状态,只