深搜走迷宫

深搜走迷宫
入口 S
出口 T
墙 *

#include <iostream>
#include <string>
using namespace std;
int n,m;
bool ok;
int dx,dy;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
string maze [110];
bool vis[110][110];
bool in(int x,int y){
	if (x>=0&&x<n&&y>=0&&y<m){
		return true;
	}
	return false ;
}
void dfs (int x,int y)
{
	if (ok)
	{
		return ;
	}
	if (maze[x][y]=='T'){
		ok=true;
		for (int i=0;i<n;i++)
		{
			for (int j=0;j<m;j++){
				printf ("%c",maze[i][j]);
			}
			printf ("\n");
		}
		return ;
	}
	vis[dx][dy]=true;
	maze[x][y]='m';
	for (int i=0;i<4;i++){
		dx=x+dir[i][0];
		dy=y+dir[i][1];
		if (in(dx,dy)&&!vis[dx][dy]&&maze[dx][dy]!='*'){
			dfs (dx,dy);	
		}
	}
	vis[dx][dy]=false;
	maze[x][y]='.';
}
int main ()
{
	//输入迷宫地图
	cin>>n>>m;
	for (int i=0;i<n;i++){
		cin>>maze[i];
	} 
	int x,y;
	for (int i=0;i<n;i++){
		for (int j=0;j<m;j++)
		{
			if (maze[i][j]=='S'){
				x=i;
				y=j;
			}
		 } 
	}
	dfs (x,y);
	return 0;
}

详解欢迎关注我的公众号:王同学的蓝桥杯训练营

### 关于蓝桥杯迷宫问题的C++解法 在蓝桥杯竞赛中,“迷宫”问题是常见的算法题目之一,通常可以通过广度优先索(BFS)或度优先索(DFS)来实现解决方案。以下是基于引用中的描述以及常见方法的具体实现。 #### BFS 实现方案 通过队列维护当前节点的状态,并记录访问过的路径以防止重复计算。以下是一个典型的 BFS 方法用于求解最短路径: ```cpp #include <iostream> #include <queue> #include <string.h> using namespace std; const int MAXN = 20; int dx[] = {-1, 0, 1, 0}; // 上下左右方向向量 int dy[] = {0, 1, 0, -1}; char dirct[] = {'U', 'R', 'D', 'L'}; // 方向字符对应关系 bool vis[MAXN][MAXN]; int dist[MAXN][MAXN]; // 记录距离 char path[MAXN * MAXN]; // 存储路径 int n, m; struct Node { int x, y, step; }; // 判断坐标是否合法 bool isValid(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m && !vis[x][y]; } void bfs(int sx, int sy) { queue<Node> q; memset(vis, false, sizeof(vis)); memset(dist, 0, sizeof(dist)); Node start = {sx, sy, 0}; q.push(start); vis[sx][sy] = true; while (!q.empty()) { Node cur = q.front(); q.pop(); if (cur.x == n - 1 && cur.y == m - 1) break; // 终点条件 for (int i = 0; i < 4; ++i) { int nx = cur.x + dx[i], ny = cur.y + dy[i]; if (isValid(nx, ny)) { vis[nx][ny] = true; dist[nx][ny] = dist[cur.x][cur.y] + 1; path[dist[nx][ny]] = dirct[i]; q.push({nx, ny, dist[nx][ny]}); } } } cout << "Shortest Path Length: " << dist[n - 1][m - 1] << endl; string ans(path + 1, path + dist[n - 1][m - 1] + 1); cout << "Path: " << ans << endl; } ``` 上述代码实现了从起点 `(0, 0)` 到终点 `(n-1, m-1)` 的最短路径查找功能[^1]。其中 `path` 数组保存了每一步的方向信息。 --- #### DFS 实现方案 对于某些特定场景下的最优路径需求,可以采用回溯的方式逐步尝试所有可能性并保留最佳结果。下面展示了一种递归形式的 DFS 方法: ```cpp #include <bits/stdc++.h> using namespace std; const int N = 20; int n, m; char maze[N][N]; bool visited[N][N]; int min_steps = INT_MAX; string best_path = ""; void dfs(int x, int y, int steps, string current_path) { if (steps > min_steps || x < 0 || y < 0 || x >= n || y >= m || maze[x][y] != '*' || visited[x][y]) return; if (x == n - 1 && y == m - 1) { if (steps < min_steps) { min_steps = steps; best_path = current_path; } return; } visited[x][y] = true; static const pair<int, char> directions[] = {{-1, 'U'}, {0, 'R'}, {1, 'D'}, {0, 'L'}}; for(auto &[dx, dc] : directions){ int nx = x + dx, ny = y; if(isValid(nx, ny)){ dfs(nx, ny, steps + 1, current_path + dc); } } visited[x][y] = false; } int main(){ cin >> n >> m; for(int i=0;i<n;++i){ for(int j=0;j<m;++j){ cin>>maze[i][j]; } } dfs(0, 0, 0, ""); cout<<"Best Path:"<<best_path<<endl; cout<<"Steps Required:"<<min_steps<<endl; return 0; } ``` 此段程序利用了技术探索每一个可行位置,并且当发现新的更优解答时更新全局变量 `best_path` 和 `min_steps`[^2]。 --- ### 总结说明 无论是 BFS 还是 DFS 都能有效处理此类问题,但在实际应用过程中需注意边界情况及效率优化等问题。例如,在大规模数据集上运行时应考虑剪枝策略减少不必要的运算开销;另外还需关注输入输出格式是否严格遵循比赛规定的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值