uva1600 - Patrol Robot

本文介绍了一种基于队列的迷宫寻路算法实现,通过构建节点树的方式寻找从起点到终点的路径。该算法使用C++编写,考虑了迷宫中障碍物的影响,并能够判断是否可以到达终点。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 25;
struct Node{
    int a,b,c;
    Node *p[4];
    Node(int a=0, int b=0, int c=0):a(a),b(b),c(c){}
};
int m,n,k,maze[maxn][maxn];
bool arrived[maxn][maxn];
int run[4][2] = {{-1, 0},{0,1},{1,0},{0,-1}};
Node* root;
queue<Node*>ept;
queue< queue<Node*> >tree;
Node* newnode(int a, int b, int c){
    Node* temp;
    temp = new Node(a, b, c);
    for(int i =0 ; i < 4; i++)
        temp->p[i] = NULL;
    return temp;
}
bool inmaze(int a, int b){
    if(a >= 0 && a < m && b >= 0 && b < n)
        return true;
    return false;
}
void build(Node* a){
    int x = a->a, y=a->b, z= a->c,aa,bb;
    if(maze[x][y]) z--;
    else z=k;
    if(!maze[x][y] || (maze[x][y]&&z == k - 1)) arrived[x][y]=true;
    for(int i = 0; i < 4; i++){
        aa = x + run[i][0], bb = y + run[i][1];
        if(inmaze(aa, bb) && !arrived[aa][bb] && (!maze[aa][bb] || z>0)){
            a->p[i] = newnode(aa, bb, z);
            tree.back().push(a->p[i]);
        }
    }
    return;
}
int main()
{
    int t;
    cin >> t;
    while(t--){
        int move =0 ;
        cin >> m >> n >> k;
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
            cin >> maze[i][j];
        root = newnode(0, 0, k);
        tree.push(ept);
        tree.push(ept);
        tree.front().push(root);
        while(1){
            if(arrived[m-1][n-1]) break;
            if(tree.front().empty() && tree.back().empty()){
                move = -1;
                break;
            }
            if(tree.front().empty()){
                tree.pop();
                tree.push(ept);
                move++;
            }
            build(tree.front().front());
            tree.front().pop();
        }
        cout << move << endl;
        memset(arrived, 0, sizeof(arrived));
        memset(maze, 0, sizeof(maze));
        tree.pop();
        tree.pop();
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值