787. 迷宫 c++,BFS法

题目链接:https://www.lintcode.com/problem/the-maze/description

思路:广度优先搜索,BFS,
起点入队,将该点的flag标记为true,表示已访问
从该点向上滚动,到头后,假如该点是结果点,直接return true,假如该点的flag为false则表示该点未访问,入队,否则不入队,跳过
从该点向下滚动,…
左右同理,
假如BFS找到结果点了就会返回true,假如没找到,则队列到最后会变空,返回false

我的代码耗时较长,100+ms,假如有更快的方法欢迎交流

	bool hasPath(vector<vector<int>> &maze, vector<int> &start, vector<int> &destination) {
		// write your code here
		int ii = maze.size();
		int jj = maze[0].size();
		vector<vector<bool>> f(ii, vector<bool>(jj, false));
		int si = start[0];
		int sj = start[1];
		int di = destination[0];
		int dj = destination[1];
		queue<pair<int, int>> q;
		q.push(pair<int, int>(si, sj));
		while (q.size())
		{
			int i = q.front().first;
			int j = q.front().second;
			f[i][j] = true;
			q.pop();
			if (i == di&&j == dj)
				return true;
			else
			{
				int a = i;
				int b = j;
				while (true)
				{
					a++;
					if (a == ii)
					{
						a--;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
					else if (maze[a][b]==1)
					{
						a--;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
				}
				a = i, b = j;
				while (true)
				{
					a--;
					if (a <0)
					{
						a++;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
					else if (maze[a][b] == 1)
					{
						a++;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
				}

				a = i, b = j;
				while (true)
				{
					b++;
					if (b==jj)
					{
						b--;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
					else if (maze[a][b] == 1)
					{
						b--;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
				}

				a = i, b = j;
				while (true)
				{
					b--;
					if (b<0)
					{
						b++;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
					else if (maze[a][b] == 1)
					{
						b++;
						if (!f[a][b])
							q.push(pair<int, int>(a, b));
						break;
					}
				}
			}
		}
		return false;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C代码实现bfs迷宫问题最短路径: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_ROW 10 #define MAX_COL 10 typedef struct { int row, col, parent; } Node; Node queue[MAX_ROW * MAX_COL]; int head = 0, tail = 0; char maze[MAX_ROW][MAX_COL+1] = { "#S######.#", "......#..#", ".#.##.##.#", ".#........", "##.##.####", "....#....#", ".######.#.", "........#.", ".#######.#", "....#...G#" }; const int dr[] = {-1, 0, 1, 0}; const int dc[] = {0, 1, 0, -1}; void enqueue(Node n) { queue[tail++] = n; } Node dequeue() { return queue[head++]; } bool is_empty() { return head == tail; } void print_path(Node n) { if (n.parent == -1) { printf("(%d, %d)\n", n.row, n.col); } else { print_path(queue[n.parent]); printf("(%d, %d)\n", n.row, n.col); } } void bfs() { Node start = {0, 1, -1}; enqueue(start); maze[start.row][start.col] = '#'; while (!is_empty()) { Node current = dequeue(); if (maze[current.row][current.col] == 'G') { print_path(current); return; } for (int i = 0; i < 4; i++) { int nr = current.row + dr[i]; int nc = current.col + dc[i]; if (nr < 0 || nc < 0 || nr >= MAX_ROW || nc >= MAX_COL) { continue; } if (maze[nr][nc] == '#' || maze[nr][nc] == 'S') { continue; } Node next = {nr, nc, head-1}; enqueue(next); maze[nr][nc] = '#'; } } } int main() { bfs(); return 0; } ``` 这个代码使用了一个队列来实现bfs。在每次循环中,它从队列中取出一个节点,检查它是否是终点(G),如果是,就打印路径并结束程序。否则,它会检查节点周围的四个邻居,如果邻居是可通行的,就将它们加入队列中。如果队列为空,就说明没有从起点到达终点的路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值