P1141 01迷宫
2022/3/28 23:25:25
本文主要是介绍P1141 01迷宫,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目链接
https://www.luogu.com.cn/problem/P1141
题目思路
一开始觉着是个宽搜就兴冲冲地背一了波模板,然后很高兴的TLE三个
所以这题需要优化,不能每个点都跑一边bfs,所以应该将连通块染色,相当于把一条路上的元素都标记成一样的,最后通过一个数组来存每个连通块的长度即可,并查集相同思想
这居然是一道橙题,可能是我太菜了
题目代码
#include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int, int> PII; const int N = 1010; int g[N][N], idx[N][N], a[1000010]; int n, m; int main() { cin >> n >> m; for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) { char c; cin >> c; g[i][j] = c - '0'; } int d = 0; queue<PII> q; for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) { if(idx[i][j] == 0) { d ++ ; q.push({i, j}); idx[i][j] = d; int cnt = 1; while(q.size()) { auto t = q.front(); q.pop(); int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; for(int i = 0; i < 4; i ++ ) { int a = t.first + dx[i], b = t.second + dy[i]; if(a >= 1 && a <= n && b >= 1 && b <= n && idx[a][b] == 0) { if(g[t.first][t.second] == 1 && g[a][b] == 0) { cnt ++ ; idx[a][b] = d; q.push({a, b}); } if(g[t.first][t.second] == 0 && g[a][b] == 1) { cnt ++ ; idx[a][b] = d; q.push({a, b}); } } } } a[d] = cnt; } } while(m -- ) { int x, y; cin >> x >> y; cout << a[idx[x][y]] << endl; } return 0; }
这篇关于P1141 01迷宫的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16ShardingSphere 如何完美驾驭分布式事务与 XA 协议?
- 2024-11-16ShardingSphere如何轻松驾驭Seata柔性分布式事务?
- 2024-11-16Maven资料入门指南
- 2024-11-16Maven资料入门教程
- 2024-11-16MyBatis Plus资料:新手入门教程与实践指南
- 2024-11-16MyBatis-Plus资料入门教程:快速上手指南
- 2024-11-16Mybatis资料入门教程:新手必看指南
- 2024-11-16MyBatis资料详解:新手入门与初级实战指南
- 2024-11-16MyBatisPlus资料:初学者入门指南与实用教程
- 2024-11-16MybatisPlus资料详解:初学者入门指南