记录手机锁屏题的思路
(昨天被虐了)
阅兵式上,国王见到了很多新奇东西,包括一台安卓手机。他很快对手机的图形解锁产生了兴趣。
解锁界面是一个 3×33 \times 33×3 的正方形点阵,第一行的三个点标号 1,2,31, 2, 31,2,3,第二行的三个点标号 4,5,64, 5, 64,5,6,第三行的三个点标号 7,8,97, 8, 97,8,9。密码本身是一段序列,表示经过点的先后顺序,但遵循如下规则:
密码至少经过四个点。
不能重复经过同一个点。
路径上的中间点不能跳过,除非已经被经过(342734273427 是合法的,但 372437243724 不合法)。
他想设置的密码的长度为正整数 k(1≤k≤9)k(1\le k\le 9)k(1≤k≤9),密码序列为 s1s2…sk(0≤si
#include<iostream>
using namespace std;
int chongfu(int *xulie, int changdu)
{
int wuwu = 0;
for (int a = 0;a < changdu;a++)
{
for (int b = 0;b < changdu;b++)
{
if (xulie[a] == xulie[b])
{
wuwu = 1;
}
}
}
return wuwu;
}
int chongtu(int *xulie, int changdu)
{
int chuchu = 0;
int ee[3][3] = { { 0,0,0 },{ 0,0,0 },{ 0,0,0 } };
for (int a = 0;a < changdu;a++)
{
if (xulie[a] != 0)
{
ee[((xulie[a]-1) / 3)][(xulie[a] % 3)-1] = a;
}
}
for (int a = 0;a < 3;a++)
{
for (int b = 0;b < 3;b++)
{
for (int c = 0;c < 3;c++)
{
for (int d = 0;d < 3;d++)
{
if (ee[a][b] + 1 == ee[c][d])
{
if ((d - b)*(d - b) + (c - a)*(c - a) == 4)
{
if (d != b)
{
if (ee[a][b + 1] == 0)
{
chuchu = 1;
}
}
else
{
if (ee[a + 1][b] == 0)
{
chuchu = 1;
}
}
}
if ((d - b)*(d - b) + (c - a)*(c - a) == 8)
{
if (ee[a+1][b + 1] == 0)
{
chuchu = 1;
}
}
}
}
}
}
}
return chuchu;
}
int main()
{
int T;
cin >> T;
for (int a = 0;a < T;a++)
{
int xulie[9] = { 0,0,0,0,0,0,0,0,0 };
int changdu;
cin >> changdu;
for (int b = 0;b < changdu;b++)
{
cin >> xulie[b];
}
if ((changdu < 4) || (chongfu(xulie, changdu) == 1) || (chongtu(xulie, changdu) == 1))
{
cout << "invalid" << endl;
}
else
{
cout << "valid" << endl;
}
}
return 0;
}