原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5641
感悟:
这道题简直坑死了,本来写的好好的感觉没问题了,教的时候RE了,数组越界,仔细看看题目,发现输入的数字是(0到int_max),感觉很疑惑,不是应该1-9么。。
没想到这题就是想让你判断,否决掉大于9的数。。感觉坑,所以vis数组一直越界。
解决了上述问题之后,再交结果是TLE,超时,仔细看了一下代码发现没啥问题,结果就想到会不会是IO量太多,cin速度太慢,换成scanf之后就A了。
我还是图样图森破~
C++代码:
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int map[11][2]={{0,0},{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3}};
bool vis[20];
bool Cando(int a,int b){
if(vis[b]){
return false;
}
else if(abs(map[b][0]-map[a][0])==2&&abs(map[b][1]-map[a][1])==2&&!vis[(a+b)/2]){
return false;
}
//如果在对角线且隔一个并且中间那块没被用过,就不行
else if(map[b][0]==map[a][0]&&abs(map[b][1]-map[a][1])==2&&!vis[(a+b)/2]){
return false;
}
//如果在同一行且隔一个并且中间那块没被用过,就不行
else if(map[b][1]==map[a][1]&&abs(map[b][0]-map[a][0])==2&&!vis[(a+b)/2]){
return false;
}
//如果在同一列且隔一个并且中间那块没被用过,就不行
vis[b]=true;
return true;
}
int main(){
int n;
int in[10];
scanf("%d",&n);
while(n--){
int len;
bool flag=true;
memset(vis,0,sizeof(vis));
scanf("%d",&len);
for(int i=0;i<len;i++){
scanf("%d",&in[i]);
if(in[i]<1||in[i]>9){
flag=false;
}
}
if(len<4||!flag){
printf("invalid\n");
continue;
}
vis[in[0]]=true;
for(int i=1;i<len;i++){
if(!Cando(in[i-1],in[i])){
flag=false;
}
}
if(!flag){
printf("invalid\n");
}
else{
printf("valid\n");
}
}
return 0;
}