注意判断Si的范围。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cctype>
using namespace std;
int map[15][15];
int vis[15];
int main () {
map[1][3] = map[3][1] = 2;
map[1][7] = map[7][1] = 4;
map[3][9] = map[9][3] = 6;
map[7][9] = map[9][7] = 8;
map[1][9] = map[9][1] = 5;
map[3][7] = map[7][3] = 5;
map[2][8] = map[8][2] = 5;
map[4][6] = map[6][4] = 5;
int T;
scanf("%d", &T);
int code[15];
int k;
while(T--) {
memset(vis, 0, sizeof(vis));
scanf("%d", &k);
int i, f = 1;
for(i = 0; i < k; i++) {
scanf("%d", code + i);
if(code[i] > 9 || code[i] < 1) {
f = 0;
}
}
if(k < 4) {
printf("invalid\n");
continue;
}
if(!f) {
printf("invalid\n");
continue;
}
vis[code[0]] = 1;
int flag = 1;
for(i = 1; i < k; i++) {
if(vis[code[i]] == 1) {
flag = 0;
break;
}
else if(map[code[i - 1]][code[i]] && !vis[map[code[i - 1]][code[i]]]){
flag = 0;
break;
}
vis[code[i]] = 1;
}
if(flag) printf("valid\n");
else printf("invalid\n");
}
return 0;
}