当日总结

链接:https://ac.nowcoder.com/acm/contest/19851/1002
来源:牛客网

安卓图案解锁的密码有这样的一些特点:
1.每个数字最多只会被使用一次。
2.如果想直接连接两个数字,但是线段中会经过另一个数字,当且仅有那个数字已经在之前就被使用过了,才会合法。(比如你想从1直接连接到9,那么要么是1->5->9,要么是5在之前已经被使用过了,然后才能直接从1->9)
输入描述:
多组输入
每组输入占一行,包含一串数字(1~9),长度不超过30
输出描述:
输出这个安卓图案解锁是否合法,如果合法输出"YES",反之输出"NO" (请参照样例输出,不要输出引号)

include

include

include

using namespace std;

bool valid(int a, int b, vector& is) {
if (is[b] == 0) {
int mid = a + b;
//is[b] = 1;
if (a % 2 == 0 && b % 2 == 0 && a + b != 10) {
return 1;
}
else if (a != 5 && b != 5 && mid % 2 == 0) {
if (is[mid / 2] == 1) {
return 1;
}
else return 0;
}
else return 1;
}
else return 0;
}

bool check(string s){
if (s.size() > 9) return 0;
s = '0' + s;
vector is(10, 0);
is[s[1] - '0'] = 1;
for (int i = 1; i < s.size() - 1; i++) {
if (valid(s[i] - '0', s[i + 1] - '0', is)) {
is[s[i + 1] - '0'] = 1;
}
else return 0;
}
return 1;
}
int main() {
string s;
while (cin >> s) {
if (check(s)) {
cout << "YES" << endl;
}
else cout << "NO" << endl;
}
}

posted @ 2025-11-24 23:04  lagranSun  阅读(4)  评论(0)    收藏  举报