例题6-12 UVA572 Oil Deposits 基础dfs求连通块

题目连接:https://vjudge.net/problem/UVA-572

思路:基础dfs

Code:(紫书版本)

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int AX = 1e2+5;
char mp[AX][AX];
int id[AX][AX];
int n , m;
void dfs( int r , int c , int idx ){
  if( r < 0 || r >= m || c < 0 || c >= n ) return ;
  if( id[r][c] || mp[r][c] != '@' ) return;
  id[r][c] = idx;
  for( int dr = -1 ; dr <= 1 ;dr++ ){
   for( int dc = -1 ; dc <= 1 ; dc++ ){
    if( dr || dc ) dfs( r + dr , c + dc , idx );
  } 
}
} 

int main(){
  while( ~scanf("%d%d",&m,&n) && n && m ){
    int cnt = 0;
    for( int i = 0 ; i < m ; i++ ) scanf("%s",mp[i]);
      memset(id,0,sizeof(id));
    for( int i = 0 ; i < m ; i++ ){
      for( int j = 0 ; j < n ; j++ ){
        if( id[i][j] == 0 && mp[i][j] == '@' ){
          dfs( i , j , ++cnt );
        }
      }
    }
    cout << cnt << endl;
  }
  return 0;
}

(方向数组版本):

Code:

#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
char oil[200][200];
int dir[8][2] = {
  {1,0},
  {-1,0},
  {0,1},
  {0,-1},
  {1,1},
  {-1,1},
  {1,-1},
  {-1,-1},
};
void dfs(int n,int m,int x,int y){
  for(int i=0;i<8;i++){
    int xx = x + dir[i][0];
    int yy = y + dir[i][1];
    if(xx>=0 && xx<n && yy>=0&&yy<m && oil[xx][yy]=='@'){
      oil[xx][yy] = '*';
      dfs(n,m,xx,yy);
    }
  }
}
int main(){
  int n,m;
  while(cin>>n>>m){
    if(n==0&&m==0)  break;
    int ans = 0;
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
        cin>>oil[i][j];
      }
    }
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          if(oil[i][j]=='@'){
            ans++;
            oil[i][j] = '*';
            dfs(n,m,i,j);
          }
        }
      }
    cout<<ans<<endl;
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值