bfs入门之矩阵距离

173. 矩阵距离 - AcWing题库

bfs,Breadth First Search

中文名是宽度优先搜索,也叫广度优先搜索。

是图上最基础、最重要的搜索算法之一。

所谓宽度优先。就是每次都尝试访问同一层的节点。 如果同一层都访问完了,再访问下一层。

这样做的结果是,BFS 算法找到的路径是从起点开始的 最短 合法路径。换言之,这条路径所包含的边数最小。

在 BFS 结束时,每个节点都是通过从起点到该点的最短路径访问的。

算法过程可以看做是图上火苗传播的过程:最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。

一般用队列实现,也就是从队列 Q 中取出队首的节点 u,然后把与 u 相邻的所有节点 v 标记为已访问过并放入队列 Q,以此可以储存“传播火苗”后的状态。

比如这道题,可以想到所有‘1’的距离B都是0,由于BFS 算法找到的路径是从起点开始的 最短 合法路径,那么初始时便可以把这些‘1’的点全部入队,之后把符合条件的点的距离更新后继续入队

#include<bits/stdc++.h>

using namespace std;
using ll = long long;
const int maxn = 1005;
const int MOD = 998244353;
int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}
int dx[4] = {-1, 1, 0, 0}
, dy[4] = { 0,0, -1, 1 };
char a[maxn][maxn];
int b[maxn][maxn];
int n, m;
int fx, fy;

struct My {
	int x; int y;
};
queue<My>q;

void bfs() {
	while (!q.empty()) {
		My t = q.front();
		q.pop();

		for (int i = 0; i < 4; i++) {
			int tx = t.x + dx[i], ty = t.y + dy[i];
			if (b[tx][ty] != -1)
				continue;
			if (tx >= 0 && tx < n && ty >= 0 && ty < m) {
				b[tx][ty] = b[t.x][t.y] + 1;
				q.push({ tx,ty });
			}
			else
				continue;
		}
	}
}

inline void solve() {
	cin >> n >> m;
	for (int i = 0; i< n; i++) {
		cin >> a[i];
	}
	memset(b, -1, sizeof b);
	for (int i = 0; i < n; i++){ 
		for (int j = 0; j < m; j++) {
			if (a[i][j] == '1') {
				b[i][j] = 0;
				q.push({ i,j });
			}
		}
	}
	bfs();
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << b[i][j] << ' ';
		}
		cout << '\n';
	}
	return;
}

signed main(){

	ios::sync_with_stdio(false);
	cin.tie(0);
	std::cout.tie(0);

	int t = 1;
	//cin >> t;
	while (t--)
		solve();

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用广度优先搜索(BFS)算法求解可达矩阵C++代码示例: ```cpp #include <iostream> #include <queue> #include <vector> using namespace std; // 定义矩阵的行列数 const int ROWS = 5; const int COLS = 5; // 定义矩阵的四个方向 const int dx[] = {1, -1, 0, 0}; const int dy[] = {0, 0, 1, -1}; // 判断坐标(x, y)是否在矩阵内 bool isValid(int x, int y) { return x >= 0 && x < ROWS && y >= 0 && y < COLS; } // 使用BFS算法求解可达矩阵 vector<vector<bool>> findReachableMatrix(vector<vector<int>>& matrix) { vector<vector<bool>> reachable(ROWS, vector<bool>(COLS, false)); vector<vector<bool>> visited(ROWS, vector<bool>(COLS, false)); queue<pair<int, int>> q; q.push({0, 0}); visited[0][0] = true; reachable[0][0] = true; while (!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (isValid(nx, ny) && !visited[nx][ny] && matrix[nx][ny] == 1) { q.push({nx, ny}); visited[nx][ny] = true; reachable[nx][ny] = true; } } } return reachable; } int main() { // 定义示例矩阵 vector<vector<int>> matrix = { {1, 0, 1, 0, 1}, {1, 1, 0, 1, 0}, {0, 1, 1, 0, 1}, {0, 0, 1, 1, 0}, {1, 1, 1, 1, 1} }; // 求解可达矩阵 vector<vector<bool>> reachableMatrix = findReachableMatrix(matrix); // 输出可达矩阵 for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { cout << reachableMatrix[i][j] << " "; } cout << endl; } return 0; } ``` 这段代码使用了一个二维矩阵来表示给定的图,其1表示可以到达的位置,0表示不可到达的位置。通过BFS算法遍历矩阵,将所有可达的位置标记为true,并将结果存储在`reachableMatrix`。最后,将结果输出到控制台上。 请注意,这只是一个简单的示例代码,实际应用可能需要根据具体需求进行相应的修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值