记录一下开始拾起大学时候算法练习的过程,今天看了挑战程序设计竞赛,在POJ上做了第一个题,POJ2386
POJ传送门:http://poj.org/problem?id=2386
在看书上的解析是,我并没有想到双层循环来遍历移动方向,也没有其他题解中先设数组,然后进行遍历,采用了最笨拙的方式来将所有方向进行遍历,所以if语句用了很多,直接贴上我的AC代码,很好理解:
#include<cstdio>
#include<iostream>
using namespace std;
char a[101][101];
int n,m;
void dfs(int i,int j){
a[i][j]='.';
if(i-1>=0&&j-1>=0&&a[i-1][j-1]=='W')
dfs(i-1,j-1);
if(i-1>=0&&a[i-1][j]=='W')
dfs(i-1,j);
if(i-1>=0&&j+1<m&&a[i-1][j+1]=='W')
dfs(i-1,j+1);
if(j-1>=0&&a[i][j-1]=='W')
dfs(i,j-1);
if(j+1<m&&a[i][j+1]=='W')
dfs(i,j+1);
if(i+1<n&&j-1>=0&&a[i+1][j-1]=='W')
dfs(i+1,j-1);
if(i+1<n&&a[i+1][j]=='W')
dfs(i+1,j);
if(i+1<n&&j+1<m&&a[i+1][j+1]=='W')
dfs(i+1,j+1);
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cin>>a[i][j];
}
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
if(a[i][j]=='W'){
dfs(i,j);
ans++;
}
}
printf("%d\n",ans);
return 0;
}