hdu 1728 逃离迷宫

本文介绍了一种基于深度优先搜索(DFS)的迷宫路径寻找算法实现,通过递归方式遍历迷宫网格,寻找从起点到终点的有效路径,并考虑了路径转弯次数限制。文章详细展示了如何使用C++实现该算法。

AC代码:

#include <iostream>  
#include <cstring>  
using namespace std;  
  
struct node{  
    char ch;  
    int turn;  
    int dir;  
}maze[110][110];  
  
const int dx[] = {0,1,-1,0},dy[] = {1,0,0,-1};  
int m,n,t;  
int start_x,start_y;  
  
void dfs(int x,int y){  
    int i,flag;  
    for(int i = 0; i < 4; i++){  
        int xx = x+dx[i],yy = y+dy[i];  
        if(xx>0 && xx<=m && yy>0 && yy<=n && maze[xx][yy].ch!='*'){  
            flag = 0;  
            if (i != maze[x][y].dir){  
                flag = 1;  
            }  
            if ((maze[xx][yy].turn==-1 || (maze[x][y].turn+flag)<=maze[xx][yy].turn) && maze[x][y].turn<=t && (xx!=start_x || yy!=start_y)){     //判断下一位置的情况并剪枝  
                maze[xx][yy].turn = maze[x][y].turn+flag;  
                maze[xx][yy].dir = i;  
                maze[xx][yy].ch = '*';  
                dfs(xx,yy);     //从下一位置继续搜索  
                maze[xx][yy].ch = '.';  
            }  
        }  
    }  
}  
  
int main(){  
    int T,minturn;  
    int end_x,end_y;  
    cin>>T;  
    while(T--){  
        cin>>m>>n;  
        memset(maze,0,sizeof(maze));  
        for(int i = 1; i <= m; i++){  
            for(int j = 1; j <= n; j++){  
                cin>>maze[i][j].ch;  
                maze[i][j].turn = -1;  
            }  
        }  
        cin>>t>>start_y>>start_x>>end_y>>end_x;  
        maze[start_x][start_y].dir = -1;  
        dfs(start_x,start_y);  
        minturn = maze[end_x][end_y].turn;  
        if(start_x==end_x && start_y==end_y)  
            cout<<"yes"<<endl;  
        else if(minturn<=t && minturn!=-1)  
            cout<<"yes"<<endl;  
        else  
            cout<<"no"<<endl;  
    }  
    return 0;  
}  


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值