King's Phone
Accepts: 310
Submissions: 2980
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
阅兵式上,国王见到了很多新奇东西,包括一台安卓手机。他很快对手机的图形解锁产生了兴趣。 解锁界面是一个 3×3 的正方形点阵,第一行的三个点标号 1,2,3,第二行的三个点标号 4,5,6,第三行的三个点标号 7,8,9。密码本身是一段序列,表示经过点的先后顺序,但遵循如下规则: 1. 密码至少经过四个点。 2. 不能重复经过同一个点。 3. 路径上的中间点不能跳过,除非已经被经过(3427 是合法的,但 3724 不合法)。 他想设置的密码的长度为正整数 k(1≤k≤9),密码序列为 s1s2...sk(0≤si<INT_MAX),他想知道这个密码序列是否合法,这个问题交给了你。
输入描述
第一行一个整数表示测试组数:T(0<T≤100000) 。 每组数据占一行,每行第一个数 k,设置密码的长度;接着 k 个正整数,之间用空格隔开,表示密码序列 s1s2...sk。
输出描述
共 T 行。对每组数据,若合法输出 `valid`,否则输出 `invalid`。
输入样例
3 4 1 3 6 2 4 6 2 1 3 4 8 1 6 7
输出样例
invalid valid valid
Hint
对于第一组数据,1 到 3 跳过了路径上的点 2,所以不合法。 对于第二组数据,1 到 3 时点 2 已经被经过了,所以合法。 对于第三组数据,8→1→6→7 路径均没有中间点,所以合法。
题解:直接模拟,把所有的情况都考虑
代码:
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
#ifdef CDZSC_June
freopen("t.txt","r",stdin);
#endif //CDZSC_June
int t,n,a[20],vis[20];
scanf("%d",&t);
while(t--)
{
int vis1 = 1;
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i = 0; i<n; i++)
{
scanf("%d",&a[i]);
if(a[i] > 9 || a[i]==0)
{
vis1 = 0;
}
}
if(n <= 3 || !vis1){
puts("invalid");
}
else{
vis[a[0]] = 1;
for(int i = 1; i<n; i++)
{
if(vis[a[i]]){
vis1 = 0;
break;
}
if(a[i-1] == 1){
if((!vis[2] && a[i] == 3) || (!vis[5] && a[i] == 9) ||(!vis[4] && a[i] == 7))
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 3){
if((!vis[2] && a[i] == 1) || (!vis[5] && a[i] == 7) ||(!vis[6] && a[i] == 9))
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 7){
if((!vis[4] && a[i] == 1) || (!vis[5] && a[i] == 3) ||(!vis[8] && a[i] == 9))
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 9){
if((!vis[6] && a[i] == 3) || (!vis[5] && a[i] == 1) ||(!vis[8] && a[i] == 7))
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 2){
if(!vis[5] && a[i] ==8)
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 4){
if(!vis[5] && a[i] ==6)
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 6){
if(!vis[5] && a[i] ==4)
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else if(a[i-1] == 8){
if(!vis[5] && a[i] ==2)
{
vis1 = 0;
break;
}
else
{
vis[a[i]] = 1;
}
}
else{
vis[a[i]] = 1;
}
}
if(vis1){
puts("valid");
}
else{
puts("invalid");
}
}
}
return 0;
}