题目连接: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;
}