← Back to List

1074번: Z ↗

Solutions

C++14
1.2 KB | 1259 chars
#include <iostream>
using namespace std;

typedef long long ll;

ll cnt, a, b, d[50], cnt2;
bool check=true;

void dfs(int n, int X, int Y) {
    if(n==1) {
        if(check && X == a && Y == b) {
            cout << cnt;
            check=false;
        }
        if(check && X+1 == a && Y == b) {
            cout << cnt+1;
            check=false;
        }
        if(check && X == a && Y+1 == b) {
            cout << cnt+2;
            check=false;
        }
        if(check && X+1 == a && Y+1 == b) {
            cout << cnt+3;
            check=false;
        }     
    }
    

    if(n>=2) {
        if(a < X + d[n-1] && b< Y + d[n-1] && check) {
            dfs(n-1,X,Y);
        }
        else if(check && X+d[n-1]<=a && b < Y + d[n-1]) {
            cnt += d[2*(n-1)];
            dfs(n-1,X+d[n-1],Y);
        }
        else if(check && a < X + d[n-1] && Y + d[n-1] <= b) {
            cnt += 2*d[2*(n-1)];
            dfs(n-1,X,Y+d[n-1]); 
        }
        else if(check && X + d[n-1] <=a && Y + d[n-1] <=b) {
            cnt += 3*d[2*(n-1)];
            dfs(n-1,X+d[n-1],Y+d[n-1]);
        }
    }
}
        
int main() {
    int n;
    cin >> n >> b >> a;
    d[0] = 1;
    for(int x = 1; x <= 40; x++) d[x] = d[x - 1] * 2;
    dfs(n,0,0);
}