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 }

 

posted @ 2020-04-20 14:15  sewage  阅读(254)  评论(0编辑  收藏  举报