走迷宫(dfs)
走迷宫
描述
给一个 n 行 m 列的 2 维的迷宫,‘S’表示迷宫的起点,‘T’表示迷宫的终点,’#‘表示不能通过的点,’.’ 表示可以通过的点。你需要从’S’出发走到’T’,每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。
输入描述
第一行输入 n, m (1≤n,m≤10) 表示迷宫大小。
接下来输入 n 行字符串表示迷宫。
输出描述
输入通过迷宫的方法数。
用例输入 1
2 3 S.# ..T
用例输出 1
2
用例输入 2
3 3 S.. .#. ..T
用例输出 2
2
#include <iostream> using namespace std; int head[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};//朝向 char p[11][11]; int visit[11][11] = {0};//搜索记号 int ans = 0; int x, y; int m, n; void dfs(int x, int y) { if (p[x][y] == 'T')//到达目的地 { ans++; return; } visit[x][y] = 1;//走过此地的记号 int tx, ty; for (int i = 0; i < 4; i++) { tx = x + head[i][0]; ty = y + head[i][1];//四向搜索 if (tx >= 0 && ty >= 0 && p[tx][ty] != '#' && visit[tx][ty] == 0 && tx < n && ty < m) { dfs(tx, ty);//此处递归时前面的路都已标记 } } visit[x][y] = 0;//此处递归返回后,保证其它路线畅通 } int main() { cin >> n >> m; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { cin >> p[i][j]; if (p[i][j] == 'S')//找到入口 { x = i; y = j; } } dfs(x, y); cout << ans; }
感觉自己还是不太懂这类题😔,下面放一个大佬的整理
int xx[4] = {-1,0,1,0},yy[4] = {0,1,0,-1}; // 上 右 下 左 void dfs(int x,int y){ if(x,y是终点){ count ++; // 计数,返回输出等等 return ; } a[x][y] = '#'; //标记(x,y)已经访问了 //接下来上下左右循环深搜 for(i = 0;i < 4;i ++){//这种遍历的格式很多,个人喜欢这种 int tx = x + xx[i]; int ty = y + yy[i]; if(){// tx 和 ty 都没有访问过且满足一写必要的条件,则继续往下深搜 dfs(tx,ty); } } a[x][y] = '.'; // 解除标记,因为已经到底了,然后从底部依次往上解除标记 } int main(){ //第一步 输入一些数 数组的值 //第二步 找到起点终点,调用dfs函数 //第三步 根据所求的值,设置条件语句等进行判断输出 return 0; }
//(6条消息) 蓝桥杯dfs模板题--走迷宫整理与反思_码卡巴卡i的博客-CSDN博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?