(模拟)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了。

我还是图样图森破~


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值