练习赛补题------F - Philosopher's Walk 思路+递归

地址:https://codeforces.com/gym/101667/attachments

因为外层的图形是从内层的图形变化得来的,只要知道他们之间是怎样转换的即可,每个图形分为四个部分;
先分析w1的图形,如何转换到w2的;
w2的图形分为四个部分:
1>x:1~ 2 y:1~2
通过w1的图形x,y坐标相互交换
2>x:1~2 y:3 ~ 4
w1图形x坐标不变,y坐标+2^(k - 1)
3>x: 3 ~ 4 y: 3 ~ 4
w1图形x,y坐标都 + 2^(k - 1)
4>x: 3 ~ 4 y: 1 ~ 2
w1图形的第i个点对应w2图形的n - i + 1 点;
将x,y坐标交换后,x坐标 + 2 * abs(x - 2^(k - 1))+ 1,y坐标不变

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
#define mp make_pair
#define pb push_back
#define fi first
#define se second

int a[35];

pair<int,int> dfs(int k,int id)
{
    //cout << id << endl;
    if(k == 1){
        pair<int,int>tmp;
        switch(id){
            case 1:tmp = mp(1,1);break;
            case 2:tmp = mp(1,2);break;
            case 3:tmp = mp(2,2);break;
            case 4:tmp = mp(2,1);break;
        }
        return tmp;
    }
    int t = a[2 * k - 2];
    pair<int,int>ans;
    if(id >= 1 && id <= t){
        pair<int,int> tmp = dfs(k - 1,id);
        ans.fi = tmp.se;
        ans.se = tmp.fi;
    }
    if(id >= t + 1 && id <= 2 * t){
        pair<int,int> tmp = dfs(k - 1,id - t);
        ans.fi = tmp.fi;
        ans.se = tmp.se + a[k - 1];
    }
    if(id >= 2 * t + 1 && id <= 3 * t){
        pair<int,int> tmp = dfs(k - 1,id - 2 * t);
        ans.fi = tmp.fi + a[k - 1];
        ans.se = tmp.se + a[k - 1];
    }
    if(id >= 3 * t + 1 && id <= 4 * t){
        pair<int,int> tmp = dfs(k - 1,t - id + 3 * t + 1);
        ans.fi = tmp.se + 2 * abs(tmp.se - a[k - 1]) + 1;
        //cout << tmp.fi << " " << tmp.se << endl;
        ans.se = tmp.fi;
    }
    return ans;
}

int main()
{
    a[0] = 1;
    for(int i = 1;i <= 32;++i){
        a[i] = 2 * a[i - 1];
    }
    int n,m;
    while(~scanf("%d %d",&n,&m)){
        int k;
        for(int i = 1;i <= 15;++i){
            if(n == a[i]){
                k = i;
                break;
            }
        }
        pair<int,int> ptr = dfs(k,m);
        printf("%d %d\n",ptr.fi,ptr.se);
    }
    return 0;
}

发布了269 篇原创文章 · 获赞 33 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36386435/article/details/89045953