计蒜客:踏青(DFS)

解题思路:

dfs深度优先搜索,用map存储地图,vis记录是否遍历,主函数里for循环寻找没有来到过的草丛,遇到了就res++且dfs此点

此题里的dfs实质是将一块草丛扩充成为一片草地,即遇到一块草地,就dfs寻找和其连续的草地后将此块vis设为1,即连成一片草地

循环到这快地时因为vis==1所以就会跳过不再判断

 1 #include 
 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){
24         for(int j=0;j){
25             cin>>map[i][j];//输入地图
26         }
27     }
28     for(int i=0;i){
29         for(int j=0;j){
30             if(map[i][j]=='#'&&vis[i][j]==0){//寻找地图里的草地
31                 res++;//找到即结果加1
32                 dfs(i,j);//寻找连续草地
33             }
34         }
35     }
36     cout<endl;//输出结果
37     return 0;
38 }

 

你可能感兴趣的:(计蒜客:踏青(DFS))