本文主要是介绍AcWing 2060.奶牛选美,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;
}
这篇关于AcWing 2060.奶牛选美的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!