poj2488A Knight's Journey

本文深入探讨了DFS算法的应用及实现细节,通过一个具体题目,介绍了如何利用DFS解决路径寻找问题,并提供了完整的C++代码实现。
/*这个题有很多方法但是我直接想到的是dfs,经典dfs的方法,思想沿用深搜的思想,控制好边界条件,主要就是一个安字典序排列的问题,这个需要规定一个特定的方向即可,如下面数组里dir的方向其他没什么了,这类题需要在脑子有一个固定的深搜的模式,虽然题可能很灵活但是用的方法不会变化太多不然怎么可能叫dfs,熟练掌握那种思维方法很重要*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int n, p, q, flag, vis[30][30], step;//n组数据,p字母个数,q数字个数,flag判断结束的标志,vis访问的标志,step判断步数是否超限
int dir[][2]= {-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};

struct node{
    int x, y;//横纵坐标
}print[100000];

void dfs(int a, int b)//横纵坐标的下标
{
    if(step == p*q){
        flag = 1;
        return ;
    }
    for(int i = 0; i < 8; i++){
        int dx =a + dir[i][0];
        int dy =b + dir[i][1];
        if(dx > 0 && dx <= q && dy > 0 && dy <= p && !vis[dx][dy]){
            vis[dx][dy] = 1;
            print[step].x = dx;
            print[step].y = dy;
            ++step;
            dfs(dx,dy);//直接传dxdy这是更新后的,++step就不用解释了
            if(step == p*q){//这里是必须要加的很有可能直接走完的情况若不加便永远有可能走不完
                flag = 1;
                return ;
            }
            --step;
            vis[dx][dy] = 0;
        }
    }
}

int main()
{
    int m = 0;//m组数据
    while(scanf("%d", &m) != EOF){
        int test = 0;
        while(m--){
            scanf("%d%d", &p,&q);
            printf("Scenario #%d:\n", ++test);
            memset(vis, 0, sizeof(vis));
            memset(print, 0, sizeof(print));
            step = 1;
            flag = 0;
            print[0].x = print[0].y = 1;
            vis[1][1] = 1;
            dfs(1, 1);
            if(flag){
                for(int i = 0; i < step; i++){
                    printf("%c%d", (print[i].x-1)+'A', print[i].y);
                }
                cout<<endl<<endl;
            }
            else
                printf("impossible\n\n");
        }
    }
    return 0;
}/*博主突然觉得进步也许就是在你不经意间的一次次敲代码,一次次总结,不放弃的时候突然带给你的力量,促使我们acmer继续走下去的动力,看到这篇还在困惑的你不要放弃和博主一起努力,总会有进步的*/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值