原題鏈接:
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;
}