NC15434 wyh的迷宫
题目
题目描述
给你一个n*m的迷宫,这个迷宫中有以下几个标识:
s代表起点
t代表终点
x代表障碍物
.代表空地
现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。
输入描述
输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每一组测试数据,第一行输入2个数n和m(1<=n,m<=500)
接下来n行,每行m个字符代表这个迷宫,每个字符都是上面4个中的一种
数据保证只有一个起点和一个终点
输出描述
对于每一组测试数据,如果可以的话输出YES,不可以的话输出NO
示例1
输入
1 3 5 s...x x...x ...tx
输出
YES
题解
知识点:DFS,BFS。
这道题两种搜索都能写,但dfs会好一点,因为bfs是所有路径都推到最后一步才出结果,不适合可行性的题,但如果地图太大的话,还是用bfs。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> #define ll long long using namespace std; int n, m; char dt[507][507]; bool vis[507][507]; const int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; bool dfs(int x, int y) { if (dt[x][y] == 't') return true; for (int i = 0;i < 4;i++) { int xx = x + dir[i][0]; int yy = y + dir[i][1]; if (xx < 0 || xx >= n || yy < 0 || yy >= m || vis[xx][yy] || dt[xx][yy] == 'x') continue; vis[xx][yy] = 1; if (dfs(xx, yy)) return true; } return false; } bool solve() { memset(vis, 0, sizeof(vis)); cin >> n >> m; int sx, sy; for (int i = 0;i < n;i++) { for (int j = 0;j < m;j++) { cin >> dt[i][j]; if (dt[i][j] == 's') sx = i, sy = j; } } vis[sx][sy] = 1; if (dfs(sx, sy))return true; return false; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { if (!solve()) cout << "NO" << '\n'; else cout << "YES" << '\n'; } return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16482971.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧