题解 | #安卓图案解锁#
安卓图案解锁
https://ac.nowcoder.com/acm/contest/20960/1005
#include<bits/stdc++.h>
using namespace std;
int main(){
string input;
int record[10] = { 0 };//0表示未使用,1表示已使用
int result[1000000] = { 0 };//1表示NO,0表示YES,这个数组一定要开大点
int num = 0;//num记录共多少组
while (cin >> input)//每次循环处理一组
{
int i = 0;
int record[10] = { 0 };//0表示未使用,1表示已使用
while (input[i] != '\0')
{
if (i >= 1)
{
int big = input[i] > input[i - 1] ? input[i] - 48 : input[i - 1] - 48;
int small = input[i] < input[i - 1] ? input[i] - 48 : input[i - 1] - 48;
if (small == 1 && (big == 3 || big == 7 || big == 9 ))
{
if (record[(big + small) / 2] == 0)
{
result[num] = 1;
break;
}
}
if (small == 2 && big == 8 )
{
if (record[(big + small) / 2] == 0)
{
result[num] = 1;
break;
}
}
if (small == 3 &&( big == 7 || big == 9 ))
{
if (record[(big + small) / 2] == 0)
{
result[num] = 1;
break;
}
}
if (small == 4 && big == 6 )
{
if (record[(big + small) / 2] == 0)
{
result[num] = 1;
break;
}
}
if (small == 7 && big == 9)
{
if (record[(big + small) / 2] == 0)
{
result[num] = 1;
break;
}
}
}
if (record[input[i] - 48] == 1)//遇到已使用则NO
{
result[num] = 1;
break;
}
else if (record[input[i] - 48] == 0)//未使用则使用它
record[input[i] - 48] = 1;
i++;
}
num++;
}
for (int x = 0; x < num; x++)//根据result数组输出YES或NO
{
if (result[x] == 1)
cout << "NO" << endl;
else if (result[x] == 0)
cout << "YES" << endl;
}
}
本题考察如何将生活中直观的显然的判断抽象成算法逻辑。 本题的算法并不是本质的、透彻的、通用的算法,而是接近枚举的算法。 本题要一次性接受多组输入,需要使用while (cin >> input){}这种结构,同时不能对每组数都立即输出结果,应该将每组结果存放在结果数组中,最后再遍历数组打印。
注:在开辟result数组时应该在要求范围内使其尽可能大,本人之前设1000报告段错误,设为1000000后AC(汗颜)
要明确什么情况下会失败:(1)遇到已经使用过的数(2)序列中相邻两数若有中间数,且中间数未使用。
对于第二种失败情况,本人采用枚举思想,对相邻两项及其中间项进行判断处理。
同时要学会灵活使用string类型,注意数字字符串中的数据和真正的数字之间通过+-48进行转换。
滴滴公司福利 1815人发布