Gym 101667F Philosopher's Walk 深搜+思维

题目链接:https://vj.e949.cn/6fd8c99567698f4bad5a228cc982bad7?v=1540561454

 

题意:

       给你一个最原始的2*2的格子以及行走路线,之后每一个图都由上一个图组成,具体为:假设上一个图为f(n-1),那么新的图的左下角为f(n-1)顺时针旋转90°,左上和右上就是f(n-1),右下角为f(n-1)逆时针旋转90°。新拼接的图可以只需连接一条线即可,每次都从左下角开始走起,给你一个步数,问这一步的时候所在的坐标位置。

 

做法:

       画一个转移状态的图,每一个大状态又可以得到下一个小状态,每个小状态的坐标增加情况都不一样,只要一个深搜就可以了。附上一个转移图。(表示,深搜真菜。。)

Gym 101667F Philosopher's Walk 深搜+思维


代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,ansx,ansy;
void ax(int add){ansx+=add;}
void ay(int add){ansy+=add;}
int changedir(int now,int next,int add){
    if(now==1) {
        if(next==1) {return 2;}
        else if(next==2) {ay(add);return 1;}
        else if(next==3) {ax(add),ay(add);return 1;}
        else {ax(add);return 3;}
    }
    else if(now==2){
        if(next==1) {return 1;}
        else if(next==2) {ax(add);return 2;}
        else if(next==3) {ax(add),ay(add);return 2;}
        else {ay(add);return 4;}
    }
    else if(now==3){
        if(next==1) {ax(add),ay(add);return 4;}
        else if(next==2) {ay(add);return 3;}
        else if(next==3) {return 3;}
        else {ax(add);return 1;}
    }
    else {
        if(next==1) {ax(add),ay(add);return 3;}
        else if(next==2) {ax(add);return 4;}
        else if(next==3) {return 4;}
        else {ay(add);return 2;}
    }
}
void dfs(int bianchang,int now,int k,int dir){//1为正,2为右 3为左 4为下
    int kuai=now/4;
    if(k<=kuai){
        if(kuai==1){
            changedir(dir,1,bianchang/2);
            return ;
        }
        dfs(bianchang/2,kuai,k,changedir(dir,1,bianchang/2));
    }
    else if(k<=2*kuai){
        if(kuai==1){
            changedir(dir,2,bianchang/2);
            return ;
        }
        dfs(bianchang/2,kuai,k-kuai,changedir(dir,2,bianchang/2));
    }
    else if(k<=3*kuai){
        if(kuai==1){
            changedir(dir,3,bianchang/2);
            return ;
        }
        dfs(bianchang/2,kuai,k-2*kuai,changedir(dir,3,bianchang/2));
    }
    else {
        if(kuai==1){
            changedir(dir,4,bianchang/2);
            return ;
        }
        dfs(bianchang/2,kuai,k-3*kuai,changedir(dir,4,bianchang/2));
    }
}
int main(){
    ansx=0,ansy=0;
    scanf("%lld%lld",&n,&k);
    ll now=1,tmp=n;
    while(tmp!=1){
        now*=4;
        tmp/=2;
    }
    dfs(n,now,k,1);
    printf("%lld %lld\n",ansx+1,ansy+1);
    return 0;
}