题目描述
Bob最新购入一款安卓手机,他发现安卓手机密码使用的是画线方式。
一共有9个点,我们按行列顺序依次为1~9。密码要求在点和点之间连线不能有还未曾经过的点。
比如说:从1出发,可以到2,4,5,6,7,8,但是不能到达3,7,9。
但是如果从2出发,先到1,这时因为2已经经过了,所以此时可以到达3。
现在给你一个密码,请问它是否符合密码的这个要求?输入
第一行是一个整数T(1≤T≤10000),表示样例的个数。
一个样例占一行,是一个最短为4位,最长9位,只含1-9的字符串,且1-9最多只有1个。输出
每个样例输出一行,如果合法输出“Yes”,否则输出“No”。
样例输入
3 16852 213 132样例输出
Yes Yes No
解题思路:用标记法 来解,最开始存个表,把两个 中间夹得有其他数的 数标记起来。 每次连线时查询即可。 其他的都很简单了,具体看代码。
AC代码:
#include <stdio.h>
#include <string.h>
bool flag;
int phone[10][10];
char password[10];
void setup()
{
phone[1][3] = phone[3][1] = 2; // 1 3 之间隔个 2
phone[4][6] = phone[6][4] = 5; // 4 6 之间隔个 5
phone[7][9] = phone[9][7] = 8; // ......
phone[1][7] = phone[7][1] = 4;
phone[2][8] = phone[8][2] = 5;
phone[3][9] = phone[9][3] = 6;
phone[1][9] = phone[3][7] = phone[7][3] = phone[9][1] = 5;
} // 剩下位置默认赋值为0,表示中间没有相隔数字。
int main()
{
int T,len,num1,num2;
setup();
scanf("%d",&T);
while ( T --)
{
int books[10] = {1}; // books[0] = 1。其余位置=0,表示该数没有设置成密码过.
scanf("%s",password);
len = strlen(password);
flag = true, num1 = password[0]-'0';
for (int i = 1; i < len; i ++)
{
num2 = password[i]-'0';
// 如果num1,num2之间没有隔数,那么phone=0,books[0] = 1,不执行if语句。 如果phone!=0,books[phone]又=0,则中间插了个没有出现过的数,则不成立
if (!books[phone[num1][num2]]) {flag = false; break;}
// 把num1,num2标记上,表明该数已经设置为密码了。
books[num1] = books[num2] = 1;
num1 = num2;
}
if (flag) puts("Yes");
else puts("No");
}
return 0;
}