逃离迷宫

★实验任务
给定一个 m× n(m 行, n 列) 的迷宫, 迷宫中有两个位置, gloria 想从迷宫的一个位置走
到另外一个位置, 当然迷宫中有些地方是空地, gloria 可以穿越, 有些地方是障碍, 她必
须绕行,从迷宫的一个位置,只能走到与它相邻的 4 个位置中, 当然在行走过程中, gloria
不能走到迷宫外面去。令人头痛的是, gloria 是个没什么方向感的人,因此,她在行走过
程中, 不能转太多弯了, 否则她会晕倒的。我们假定给定的两个位置都是空地, 初始时, gloria
所面向的方向未定, 她可以 选择 4 个方向的任何一个出发, 而不算成一次转弯。 gloria 能
从一个位置走到另外一个位置吗?
★数据输入
第 1 行为两个整数 m, n (1 ≤ m, n ≤ 100), 分别表示迷宫的行数和列数,接下来 m
行, 每行包括 n 个字符, 其中字符'.' 表示该位置为空地, 字符'*' 表示该位置为障碍, 输入
数据中只有这两种字符,每组测试数据的最后一行为 5 个整数 k, x1, y1, x2, y2 (0 ≤ k ≤
20, 1 ≤ x1, x2 ≤ m, 1 ≤ y1, y2 ≤ n), 其中 k 表示 gloria 最多能转的弯数, (x1, y1), (x2,
y2) 表示两个位置,其中 x1, x2对应行, y1, y2对应列。
★数据输出
每组测试数据对应为一行,若 gloria 能从一个位置走到另外一个位置,输出“yes” ,
否则输出“no” 。
输入示例         输出示例
5 5                yes
...**
*.**.
.....
.....
*....
2 1 1 3 1

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<queue>  
using namespace std;  
const int maxn=111;  
struct Node{  
    int x,y,turn;  
    Node(int a,int b){  
        x=a; y=b; turn=-1;  
    }  
    Node(){}  
};  
int n,m;  
int k,is,js,it,jt;  
int map[maxn][maxn];  
int offset[4][2]={{0,-1},{0,1},{-1,0},{1,0}};  
  
void init(){  
    int i,j;  
    char c;  
    for(i=0;i<=n+1;i++) map[i][0]=map[i][m+1]=1;  
    for(j=0;j<=m+1;j++) map[0][j]=map[n+1][j]=1;  
    for(i=1;i<=n;i++){  
        getchar();  
        for(j=1;j<=m;j++){  
            scanf("%c",&c);  
            if(c=='.') map[i][j]=0;  
            else map[i][j]=1;  
        }  
    }  
}  
  
void bfs(){  
    int flag=0,i;  
    queue<Node> Q;  
    Node node(is,js),next;  
    map[is][js]=-1;  
    Q.push(node);  
    while(!Q.empty()){  
        node=Q.front();  
        Q.pop();  
        if(node.x==it&&node.y==jt&&node.turn<=k){  
            flag=1;  
            break;  
        }  
        next.turn=node.turn+1;  
        for(i=0;i<4;i++){  
            int a=node.x+offset[i][0];  
            int b=node.y+offset[i][1];  
            while(map[a][b]!=1){  
                if(!map[a][b]){  
                    map[a][b]=-1;  
                    next.x=a; next.y=b;  
                    Q.push(next);  
                }  
                a+=offset[i][0];  
                b+=offset[i][1];  
            }  
        }  
    }  
    printf(flag?"yes\n":"no\n");  
}  
  
int main(){  
    scanf("%d%d",&n,&m);  
    init();  
    scanf("%d%d%d%d%d",&k,&is,&js,&it,&jt);  
    bfs();  
    return 0;  
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来解决。以下是DFS算法的实现思路: 首先,我们需要建立一个大小为n的邻接矩阵graph,用于保存每个节点的出度信息。graph[i][j]表示从节点i到节点j是否有连边。如果graph[i][j]=1,则表示节点i可以到达节点j。 然后,我们从起点开始进行DFS搜索。定义一个visited数组,用于保存每个节点是否已经被遍历。visited[i]取值为0或1,表示节点i是否已经被遍历。在DFS搜索中,我们从当前节点开始,遍历它能够到达的所有节点,如果遍历到终点m,则返回true,否则继续DFS搜索。 具体实现可以参考以下代码: ```python def DFS(graph, visited, cur, target): # 如果当前节点已经被访问过,则直接返回False if visited[cur]: return False # 如果当前节点是终点,则返回True if cur == target: return True # 标记当前节点已经被访问 visited[cur] = 1 # 遍历当前节点能够到达的所有节点 for i in range(len(graph)): if graph[cur][i] == 1: if DFS(graph, visited, i, target): return True # 如果当前节点无法到达终点,则返回False return False n = 6 m = 5 graph = [[0, 1, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 1, 0, 1, 1, 0], [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0]] visited = [0] * n if DFS(graph, visited, 0, m-1): print("可以逃出迷宫!") else: print("无法逃出迷宫!") ``` 输出结果为: ``` 可以逃出迷宫! ``` 这个算法的时间复杂度为O(n^2),因为我们需要遍历所有的节点和边。如果使用BFS算法来解决这个问题,时间复杂度为O(n+m),其中n是节点数,m是边数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值