(模拟)HDU-5641 King's Phone

原题链接:

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 }
 
原文地址:https://www.cnblogs.com/tak-fate/p/5765975.html