解题思路:
dfs深度优先搜索,用map存储地图,vis记录是否遍历,主函数里for循环寻找没有来到过的草丛,遇到了就res++且dfs此点
此题里的dfs实质是将一块草丛扩充成为一片草地,即遇到一块草地,就dfs寻找和其连续的草地后将此块vis设为1,即连成一片草地
循环到这快地时因为vis==1所以就会跳过不再判断
1 #include <iostream> 2 using namespace std; 3 int vis[105][105]; 4 char map[105][105]; 5 int n,m; 6 int ax[10]={1,0,-1,0}; 7 int ay[10]={0,1,0,-1}; 8 void dfs(int x,int y){ 9 if(x==n||y==m)//到边界,回溯 10 return; 11 vis[x][y]=1;//vis置1 12 for(int i=0;i<4;i++){ 13 int tx=x+ax[i]; 14 int ty=y+ay[i]; 15 if(map[tx][ty]=='#'&&vis[tx][ty]==0){//通过上下左右找到了与之连续的草地 16 dfs(tx,ty);//递归继续搜索 17 } 18 } 19 } 20 int main(){ 21 int res=0; 22 cin>>n>>m; 23 for(int i=0;i<n;i++){ 24 for(int j=0;j<m;j++){ 25 cin>>map[i][j];//输入地图 26 } 27 } 28 for(int i=0;i<n;i++){ 29 for(int j=0;j<m;j++){ 30 if(map[i][j]=='#'&&vis[i][j]==0){//寻找地图里的草地 31 res++;//找到即结果加1 32 dfs(i,j);//寻找连续草地 33 } 34 } 35 } 36 cout<<res<<endl;//输出结果 37 return 0; 38 }