Round 1B 2020 - Code Jam 2020A(DFS)
只有第一次移动步长1是奇数,后面都是偶数,所以x和y必定一个为奇数一个为偶数。
每次可以把步长加在x或者y的前面或者后面,四种分支DFS。
1 #define HAVE_STRUCT_TIMESPEC 2 #include <bits/stdc++.h> 3 using namespace std; 4 long long t; 5 long long maxmi; 6 long long ans[2][100]; 7 bool dfs(long long x,long long y,long long mi){ 8 maxmi=mi; 9 if(x==0&&y==0) 10 return true; 11 if((x&1)&&(y&1)) 12 return false; 13 if(!(x&1)&&!(y&1)) 14 return false; 15 bool r; 16 if(x&1){ 17 ans[0][mi]=1; 18 r=dfs((x-1)/2,y/2,mi+1); 19 if(r) 20 return true; 21 ans[0][mi]=-1; 22 return dfs((x+1)/2,y/2,mi+1); 23 } 24 else{//y&1 25 ans[1][mi]=1; 26 r=dfs(x/2,(y-1)/2,mi+1); 27 if(r) 28 return true; 29 ans[1][mi]=-1; 30 return dfs(x/2,(y+1)/2,mi+1); 31 } 32 return false; 33 } 34 int main(){ 35 cin>>t; 36 for(int i=0;i<t;++i){ 37 long long x,y; 38 scanf("%lld%lld",&x,&y); 39 long long mx=x<0?-1:1; 40 long long my=y<0?-1:1; 41 x=abs(x); 42 y=abs(y); 43 maxmi=0; 44 for(int j=0;j<33;++j){ 45 ans[0][j]= 0; 46 ans[1][j]= 0; 47 } 48 bool r=dfs(x,y,0); 49 if(!r){ 50 printf("Case #%d: IMPOSSIBLE\n",i+1); 51 continue; 52 } 53 printf("Case #%d: ",i+1); 54 for(int j=0;j<=maxmi;++j){ 55 if(ans[0][j]*mx==1) 56 printf("E"); 57 if(ans[0][j]*mx==-1) 58 printf("W"); 59 if(ans[1][j]*my==1) 60 printf("N"); 61 if(ans[1][j]*my==-1) 62 printf("S"); 63 } 64 printf("\n"); 65 } 66 return 0; 67 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)