2018/7/31-zznu-oj-问题 F: 手机密码--【裸dfs+for循环即可!——据说三个小时内只有两个人读完了题意并轻松AC了】...

问题 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


提示

九宫格密码的左上角坐标为(11

思路:

有点长的题目,裸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 }
View Code

 

题意不可怕,可怕的是盲目追榜单233~~

 

转载于:https://www.cnblogs.com/zhazhaacmer/p/9399555.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值