(模擬)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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章