栗主席(lizi)是某xxxx大学的一个不得了的程序猿,然而没想到吧,他竟然有女盆友,我们假设为QAQ!!!
安卓图案解锁
https://ac.nowcoder.com/acm/problem/13585
栗主席(lizi)是某xxxx大学的一个不得了的程序猿,然而没想到吧,他竟然有女盆友,我们假设为QAQ!!!
那天,QAQ问栗子:你的小米5s的图像解锁密码到底是多少?
栗子:嘛?我仔细想想...
QAQ:你仿佛在逗我...
...
栗子:我的图像解锁用过好多次密码,后来都是用指纹解锁,所以忘记密码辣。但是我记得可能是那几个密码
QAQ:那你务必告诉我...
栗子: ...
然后,栗子就写下了一堆可能的密码,安卓图案解锁中,数字对应的位置已经标出。
但是栗子当然不想把真正的密码告诉QAQ,所以给QAQ的一系列的密码中,甚至有一些密码,是不符合安卓图案解锁的规则的。
QAQ也知道栗子肯定不老实,给了很多错的密码,甚至不符合规则的密码,所以想请你来找出,哪些密码是不符合规则的。
安卓图案解锁的密码有这样的一些特点:
1.每个数字最多只会被使用一次。
2.如果想直接连接两个数字,但是线段中会经过另一个数字,当且仅有那个数字已经在之前就被使用过了,才会合法。(比如你想从1直接连接到9,那么要么是1->3->9,要么是3在之前已经被使用过了,然后才能直接从1->9)
19计三郭远师 提交的代码
提交时间:2021-04-07 19:33:22 语言:C++(clang++11) 代码长度:900 运行时间: 18 ms 占用内存:400K
运行状态:答案正确 得分:100
#include<bits/stdc++.h>
using namespace std;
bool panduan(string s, int book[]) {//判断是否有重复
for (int i = 0; i < s.size(); i++) {
if (book[(int)s[i] - 48] == 0) {
book[(int)s[i] - 48]++;
}
else
return false;
}
//cout << "shide" << endl;
return true;
}
int main(void) {
string a[] = { " ","379","8","179","6"," ","4","139","2","137" };//每个字符串代表该下标后需要跨数才能连接的数字
string s;
while (cin >> s) {
int book[10] = { 0,0,0,0,0,0,0,0,0,0 };//用于函数判断是否有重复数字
bool flag = true;
bool f = panduan(s, book);
if (f == 0) {
flag = false;
}
for (int i = 1; i < s.size() && flag; i++) {
if (a[(int)(s[i - 1] - 48)].find(s[i]) != -1) {//如果s中下标为i的数字在a下标i-1中的字符串中能找到则跨行了
char x = ((s[i - 1] + s[i]) / 2);//要跨过的数字x必然是俩数的平均值
if (s.find(x) > i) {//如果x在s【i】之后出现则不合理
flag = false;
break;
}
}
}
if (flag) {
puts("YES");
}
else
puts("NO");
cin.clear();
}
}