赞
踩
DFS暴力即可。
这个其实就是连通块的模型,只不过加了一点条件让你求两个连通块之间的最短距离而已,这里需要把连通块的所有坐标都存储起来,然后再进行相减求绝对值,看看哪一个最小就选哪个,这个值就是最小值了,这里用了pair<int,int>作为容器。
注意:里面的index变量如果定义在了最外面,在AcWing里面会报错,但是在VS上是没有问题的。
上代码:
- #include<iostream>
- #include<stdio.h>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<vector>
- #include<algorithm>
- #include<stack>
- #include<queue>
- #include<sstream>
- #include<map>
- #include<limits.h>
- #include<set>
- #define MAX 100
- #define _for(i,a,b) for(int i=a;i<(b);i++)
- #define ALL(x) x.begin(),x.end()
- using namespace std;
- using PII=pair<int, int>;
- int n, m,res=INT_MAX;
- char s[MAX][MAX];
- int st[MAX][MAX];
- int dx[] = { -1,1,0,0 };
- int dy[] = { 0,0,-1,1 };
-
- vector<PII>bandian[2];
- void dfs(vector<PII>&as,int x, int y) {
- as.push_back({x,y});
- for (int i = 0; i < 4; i++) {
- int a = dx[i] + x;
- int b = dy[i] + y;
- if (st[a][b])
- continue;
- if (s[a][b] != 'X')
- continue;
- if (a > n || a <= 0 || b > m || b <= 0)
- continue;
-
- if (!st[a][b] && s[a][b] == 'X') {
- st[a][b] = 1;
- dfs(as,a, b);
- }
- }
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- cin >> n >> m;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- cin >> s[i][j];
- }
- }
- int index=0;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- if (!st[i][j]&&s[i][j]=='X')
- {
- st[i][j] = 1;
- dfs(bandian[index++], i, j);
-
- }
- }
- }
-
- for (PII& it1:bandian[0]) {
- for (PII& it2 : bandian[1]) {
- res = min(res, abs(it1.first - it2.first)+abs(it1.second - it2.second));
- }
- }
- cout << res-1;
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。