原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5641
感悟:
这道题简直坑死了,本来写的好好的感觉没问题了,教的时候RE了,数组越界,仔细看看题目,发现输入的数字是(0到int_max),感觉很疑惑,不是应该1-9么。。
没想到这题就是想让你判断,否决掉大于9的数。。感觉坑,所以vis数组一直越界。
解决了上述问题之后,再交结果是TLE,超时,仔细看了一下代码发现没啥问题,结果就想到会不会是IO量太多,cin速度太慢,换成scanf之后就A了。
我还是图样图森破~
代码:
1 #include<cstring> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 6 int map[11][2]={{0,0},{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3}}; 7 bool vis[20]; 8 9 bool Cando(int a,int b){ 10 if(vis[b]){ 11 return false; 12 } 13 else if(abs(map[b][0]-map[a][0])==2&&abs(map[b][1]-map[a][1])==2&&!vis[(a+b)/2]){ 14 return false; 15 } 16 //如果在对角线且隔一个并且中间那块没被用过,就不行 17 else if(map[b][0]==map[a][0]&&abs(map[b][1]-map[a][1])==2&&!vis[(a+b)/2]){ 18 return false; 19 } 20 //如果在同一行且隔一个并且中间那块没被用过,就不行 21 22 else if(map[b][1]==map[a][1]&&abs(map[b][0]-map[a][0])==2&&!vis[(a+b)/2]){ 23 return false; 24 } 25 //如果在同一列且隔一个并且中间那块没被用过,就不行 26 vis[b]=true; 27 return true; 28 } 29 30 int main(){ 31 int n; 32 int in[10]; 33 scanf("%d",&n); 34 while(n--){ 35 int len; 36 bool flag=true; 37 memset(vis,0,sizeof(vis)); 38 scanf("%d",&len); 39 for(int i=0;i<len;i++){ 40 scanf("%d",&in[i]); 41 if(in[i]<1||in[i]>9){ 42 flag=false; 43 } 44 } 45 if(len<4||!flag){ 46 printf("invalid "); 47 continue; 48 } 49 vis[in[0]]=true; 50 for(int i=1;i<len;i++){ 51 if(!Cando(in[i-1],in[i])){ 52 flag=false; 53 } 54 } 55 if(!flag){ 56 printf("invalid "); 57 } 58 else{ 59 printf("valid "); 60 } 61 } 62 return 0; 63 }