acwing 2060 奶牛选美

简介: acwing 2060 奶牛选美

2060. 奶牛选美 - AcWing题库

我的思路过于麻烦,是先用dfs搜索其中一个联通块,选出来以后对他进行,连通性的判断, 把这个连通块全部标记为1,然后我们从每一个1出发进行bfs , 当走到一个点,我们就判断一下是否走过这个点,和这个点以前的距离是否比我们现在走到这里的距离远,如果要远的话我们就要更新一下距离;

最后bfs处理完全图以后我们需要对dfs找第二个联通块, 然后找连通块中距离最少的那个值

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std ;
const int N = 100 , INF = 1e9 ;
char mp[N][N] ;
int d[4][2] = {{0,1},{0,-1},{1,0},{-1,0}} ;
int n , m ;
int qx,qy ;
 
struct node{
  int x, y ;
  node(int xx , int yy ){
    x = xx , y = yy  ;
  }
};
queue<node> q ;
int f[N][N] ;
vector<node> a ;
void dfs1(int x , int y){//染色 
  mp[x][y] = '1' ;
  a.push_back(node(x,y)) ;
  for(int i =0 ; i < 4 ; i ++){
    int tx = x + d[i][0] , ty = y + d[i][1] ;
    if(tx<0||tx>=n||ty<0||ty>=m) continue ;
    if(mp[tx][ty] == '1' || mp[tx][ty] == '.') continue ;
    if(mp[tx][ty] == 'X') dfs1(tx,ty) ;
  }
}
void bfs(int x,int y ){
  q.push(node(x,y)) ;
  while(!q.empty()){
    node now= q.front() ;
    q.pop() ;
    int dx = now.x , dy = now.y ;
    for(int i = 0 ; i < 4 ; i ++){
      int tx = dx + d[i][0] , ty = dy + d[i][1] ;
      
      if(tx<0||tx>=n||ty<0||ty>=m||mp[tx][ty] == '1') continue ;
      
      if(f[tx][ty] > f[dx][dy] + 1){
        f[tx][ty] = f[dx][dy] + 1 ;
        q.push(node(tx,ty)) ;
      }
      else continue ;
      
    }
    
  }
}
 
int main(){
  cin >> n >> m ;
  for(int i = 0 ; i < n ; i ++)
    for(int j = 0  ;j < m ; j ++) cin >> mp[i][j] ;
    
  for(int i = 0 ; i < n;i++){
    for(int j = 0 ; j < m ; j ++){
      if(mp[i][j] == 'X') qx = i , qy = j ;
    }
  }
  for(int i = 0 ; i < n;i++){
    for(int j = 0 ; j < m ; j ++){
      f[i][j] = INF-10000 ;
    }
  }
//  for(int i = 0 ; i < n;i++){
//    for(int j = 0 ; j < m ; j ++){
//      cout << f[i][j] << " " ;
//    }
//    cout << endl ;
//  }
  dfs1(qx,qy) ;
  //int cnt = a.size() ; cout << cnt << endl ;
  for(int i = 0 ; i < a.size() ; i++){
    int x = a[i].x , y = a[i].y;
    f[x][y] = 0 ;
    bfs(x,y) ;
  }
//  for(int i = 0 ; i < n;i++){
//    for(int j = 0 ; j < m ; j ++){
//      cout << f[i][j] << " " ;
//    }
//    cout << endl ;
//  }
  for(int i = 0 ; i < n;i++){
    for(int j = 0 ; j < m ; j ++){
      if(mp[i][j] == 'X') qx = i , qy = j ;
    }
  }
  a.clear() ;
  dfs1(qx,qy) ;
  int res = INF ;
 
  for(int i = 0 ; i < a.size(); i ++){
    int x = a[i].x , y = a[i].y ;
    res = min(f[x][y],res) ;
  }
  cout << res -1<< endl ;
}
目录
相关文章
|
3月前
|
算法
AcWing 1343. 挤牛奶(每日一题)
AcWing 1343. 挤牛奶(每日一题)
|
3月前
acwing 1106 山峰和山谷
acwing 1106 山峰和山谷
21 0
|
3月前
acwing 1098 城堡
acwing 1098 城堡
22 0
AcWing 2060. 奶牛选美(每日一题)
AcWing 2060. 奶牛选美(每日一题)
|
存储 算法 Java
【AcWing每日一题】4818. 奶牛大学
【AcWing每日一题】4818. 奶牛大学
123 0
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
《蓝桥杯每日一题》递推·AcWing 3777. 砖块
83 0
|
算法 测试技术 Python
第十二届蓝桥杯《杨辉三角》-二分法
第十二届蓝桥杯《杨辉三角》-二分法
107 0
|
机器学习/深度学习 Java
AcWing——砝码称重
AcWing——砝码称重
96 0
|
算法
【AcWing&&牛客】打表找规律
【AcWing&&牛客】打表找规律
94 0
|
机器学习/深度学习 人工智能 安全
【AcWing周赛】AcWing第86场周赛
目录 <一>AcWing 4794. 健身 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 <二>AcWing 4795. 安全区域 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 <三>AcWing 4796. 删除序列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
88 0

相关实验场景

更多