问题 F: 手机密码
时间限制: 1 Sec 内存限制: 128 MB提交: 41 解决: 23
[提交] [状态] [讨论版] [命题人:admin]
题目描述 手机安全问题是大家经常关心的一个问题。 在生物解锁没有出现之前,人们通常有两种方式设置手机密码:九宫格密码和数字密码。 我们先来简化一下这两种密码的格式: 对于九宫格密码: 1.至少连接4个以上不同的圆点。 2.只能连接相邻(八方向)的圆点,且每个圆点只能通过一次。 3.密码的长度定义为经过的圆点数。 对于数字密码: 1.至少含有四个数字。 2.密码长度定义为字符数。 现在,我们来尝试用枚举来破解这两种密码,当然我们可以提前获知一些消息: 1.你可以通过观察对方解锁手机所用的时长,大致推断出对方的密码长度, 2.在通常情况下,我们可以很轻松的得到密码第一位的信息,因为它最常被触碰比较油腻。而后,你来计算一下,对于这两种密码,最差我们需要枚举多少次,才能解开这组密码。 输入 出入包含四个整数n,a,x,y, 正整数n代表密码长度, 整数a代表数字密码的一位, 正整数(x,y),代表九宫格密码第一个经过的圆点的坐标 输入已EOF结束 输出 输出包含两个正整数,分别代表最差尝试几次可以破解九宫格密码,和数字密码 样例输入 4 1 1 1 样例输出 50 1000 提示 九宫格密码的左上角坐标为(1,1)
思路:
有点长的题目,裸DFS,暴力一遍OK!
题解代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<string> 5 #include<vector> 6 #include<algorithm> 7 #define ll long long 8 using namespace std; 9 #define N 10000 10 #define ll long long 11 int mp[4][4];//(1,1)--(3,3) 12 int ans1; 13 int dir[8][2]={ {0,1},{1,0},{0,-1},{-1,0},{1,-1}, 14 {1,1},{-1,1},{-1,-1} }; 15 int vis[10][10]; 16 int n; 17 void dfs(int x,int y,int step){ 18 if(step==n) 19 { 20 ans1++;return ; 21 } 22 for(int i=0;i<=7;i++){ 23 int dx,dy; 24 dx=x+dir[i][0]; 25 dy=y+dir[i][1]; 26 if(dx>=1&&dy>=1&&dx<=3&&dy<=3&&!vis[dx][dy]){ 27 vis[dx][dy]=1; 28 dfs(dx,dy,step+1); 29 vis[dx][dy]=0; 30 } 31 } 32 33 } 34 int main() 35 { 36 int beg,x,y; 37 while(scanf("%d%d%d%d",&n,&beg,&x,&y)!=EOF){ 38 ans1=0; 39 ll ans2=1; 40 memset(vis,0,sizeof(vis)); 41 42 vis[x][y]=1; 43 dfs(x,y,1); 44 45 for(int i=2;i<=n;i++) 46 ans2*=10; 47 48 printf("%d %lld\n",ans1,ans2); 49 } 50 51 52 return 0; 53 }
题意不可怕,可怕的是盲目追榜单233~~