经典的DFS问题,参见《挑战程序竞赛》第二版 32页。
只需注意每次对一个 'W' 做完DFS后,将其替换成'.',保证不会重复搜索。
个人感觉可以用另一个数组记录访问过的原数组的位置,进一步加快速度。
不多说了,上代码,用蛋疼的XCODE写的。
//
// 033_water_counting.cpp
// changlle
//
// Created by user on 12/22/15.
// Copyright (c) 2015 user. All rights reserved.
//
#include <iostream>
using namespace std;
void dfs();
void solve();
int N=10, M=12;
char field[10][12];
int main (){
for (int i=0; i<N;i++)
for (int j=0; j<M;j++){
if ((i==j-1 || i==j-4) && (i<=5||i>=7))
field[i][j]='w';
else
field[i][j]='.';
}
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
cout<<field[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
solve();
return 0;
}
void dfs(int x, int y) {
field[x][y]='.';
for (int dx=-1; dx<=1;dx++){
for (int dy=-1; dy<=1;dy++){
int nx=x+dx;
int ny=y+dy;
if (0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny]=='w')
dfs(nx,ny);
}
}
}
void solve(){
int res=0;
for (int i=0; i<N; i++)
for(int j=0;j<M;j++) {
if (field[i][j]=='w')
{
dfs(i,j);
res++;
}
}
cout<<res<<endl;
}