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

本文介绍了一种使用深度优先搜索(DFS)解决复杂路径寻找问题的方法,具体为在一个不断扩大的网格中,根据特定的规则进行路径规划,通过递归调用实现对每个子状态的坐标增量计算,最终确定指定步数下的坐标位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

题意:

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

 

做法:

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


代码如下:

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值