POJ 3083--Children of the Candy Corn

迷宫寻路策略
本文介绍了一种在迷宫中寻找从起点到终点路径的方法,包括靠墙向左走、靠墙向右走以及自由行走的最短路径算法。通过深度优先搜索(DFS)和广度优先搜索(BFS)来解决这一问题,并详细阐述了如何处理不同方向的选择。

题目:这是题目


题意:一个迷宫,从S点走到E点,求一直靠墙向左走和靠墙向右走以及随便走的最短路, 保证数据的合法性,一定会有路。


定义的方向:

int x[4] = {0, -1, 0, 1};//左 上 右 下
int y[4] = {-1, 0, 1, 0};

思路:要求靠墙向左走和靠墙向右走,用DFS,求随便走最短路用BFS。该题的比较难的地方是处理方向。

对于一直靠墙向左走,如下图,假设你到达红色的点,方向是turn,此时首先判断左边是否有路,判断方向为(turn + 3)% 4,如果左边没路,则判断前面(turn),如果前面没路,则判断右边,否则判断下面(当然这个方向是相对方向) 。

对于一直靠墙向右走,同如下图,假设你到达红色的点,先判断右边是否有路(turn + 1)% 4, 如果没有路,再判断前面(turn),再判断左边(turn + 3)% 4, 否则判断下面(turn + 2)% 4。



好了方向问题搞清楚了, 那么靠墙向左走,循环的方向依次为 (turn + 3)% 4, turn ,(turn + 1)% 4,(turn + 2)% 4,那么循环可以有个规律,

for (int i = 3, k = 0; k < 4; i = (i + 1) % 4, k++) 
		turn = (turn + i)% 4
靠墙向右走的循环方向依次为(turn + 1)% 4, turn ,(turn + 3)% 4,(turn + 2)% 4,循环为:

for (int i = 1, k = 0; k < 4; i = (i + 3) % 4, k++)
	        turn = (turn + i)% 4;

实现如下:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;

const int MAX = 45;
char _map[MAX][MAX];
bool visit[MAX][MAX];

int w, h;
int sx1, sy1, sx2, sy2, ex, ey;
int sum1, sum2;
int x[4] = {0, -1, 0, 1};//左 上 右 下
int y[4] = {-1, 0, 1, 0};

bool judge(int x, int y) {
    if (x >= 0 && x < h && y >= 0 && y < w && (_map[x][y] == '.' || _map[x][y] == 'E') )
        return true;
    return false;
}
//判断是否能走
struct node {
    int xxx, yyy;
    char key;
    int step;
};



void dfs_right(int xx, int yy, int turn) {
    if (xx == ex && yy == ey)
        return;
    else {
        for (int i = 1, k = 0; k < 4; i = (i + 3) % 4, k++) {
            if (judge(xx + x[(turn + i) % 4], yy + y[(turn + i) % 4])) {
                sum2++;
                dfs_right(xx + x[(turn + i) % 4], yy + y[(turn + i) % 4], (turn + i) % 4);
                break;
            }
        }
    }
}

void dfs_left(int xx, int yy, int turn) {
    if (xx == ex && yy == ey)
        return;
    else {
        for (int i = 3, k = 0; k < 4; i = (i + 1) % 4, k++) {
            if (judge(xx + x[(turn + i) % 4],yy + y[(turn + i) % 4])) {
                sum1++;
                dfs_left(xx + x[(turn + i) % 4], yy + y[(turn + i) % 4], (turn + i) % 4);
                break;
            }
        }
    }
}

void turn_left() {
    if (judge(sx1, sy1 - 1)) {
            dfs_left(sx1, sy1 - 1, 0);
    }
    else if (judge(sx1 - 1, sy1)) {
        dfs_left(sx1 - 1, sy1, 1);
    }
    else if (judge(sx1, sy1 + 1)) {
        dfs_left(sx1, sy1 + 1, 2);
    }
    else {
        dfs_left(sx1 + 1, sy1, 3);
    }
}

void turn_right() {
     if (judge(sx2, sy2 + 1)) {
        dfs_right(sx2, sy2 + 1, 2);
    }
    else if (judge(sx2 + 1, sy2)) {
        dfs_right(sx2 + 1, sy2, 3);
    }
    else if (judge(sx2, sy2 - 1)) {
        dfs_right(sx2, sy2 - 1, 0);
    }
    else {
        dfs_right(sx2 - 1, sy2, 1);
    }
}

int bfs() {
    queue <node>q;
    node start;
    start.xxx = sx1;
    start.yyy = sy1;
    start.key = 'S';
    start.step = 1;
    q.push(start);
    while (!q.empty()) {
        node head, tail;
        head = q.front();
        q.pop();
        if (head.xxx == ex && head.yyy == ey)
            return head.step;
        for (int i = 0; i < 4; i++) {
            int xi = head.xxx + x[i];
            int yi = head.yyy + y[i];
            if (xi >= 0 && xi < h && yi >= 0 && yi < w && !visit[xi][yi]) {
                tail.xxx = xi;
                tail.yyy = yi;
                tail.key = _map[xi][yi];
                tail.step = head.step + 1;
                visit[xi][yi] = true;
                q.push(tail);
            }
        }

    }
    return -1;
}


int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        memset(visit, false, sizeof(visit));
        scanf("%d%d", &w, &h);
        getchar();
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                scanf("%c", &_map[i][j]);
                if (_map[i][j] == '#')
                    visit[i][j] = true;
                else if (_map[i][j] == 'S') {
                    sx1 = i;
                    sx2 = i;
                    sy1 = j;
                    sy2 = j;
                }
                else if (_map[i][j] == 'E') {
                    ex = i;
                    ey = j;
                }
            }
            getchar();
        }
        sum1 = 1;
        sum2 = 1;
        turn_left();
        turn_right();
        cout << sum1 + 1 << " " << sum2 + 1 << " " << bfs() << endl;
    }
}


内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值