先介紹一下dfs:
dfs是一種搜尋方式,也就是深度搜尋
假如有一個迷宮,要找到出口,可以先去一條路一條路試錯,錯了就傳回之前的分叉路口,
再試錯,探索,進而找到出口。
代碼如下
a代表細胞資料
void dfs(int x,int y){
a[x][y]=0;//已經探索過了
if(a[x-1][y]>0)dfs(x-1,y);//向上走
if(a[x+1][y]>0)dfs(x+1,y);//向下走
if(a[x][y+1]>0)dfs(x,y+1);//向右走
if(a[x][y-1]>0)dfs(x,y-1);//向左走;
}
進入正題
整體思路如下
______________________________________________________
1 周遊二維數組每一個點,如果是細胞數字,sum++,進行dfs深搜。
2 搜尋的時候将細胞數字改成零,然後去找相鄰的細胞數字,
進而将一個大細胞全部清零,防止下次在通路。
3 輸出sum
_______________________________________________________
這裡要注意輸入的時候數字與數字之間沒有空格
格式化輸入scanf("%1d",&a[i][j]);
假如讀入123 他隻會讀入1 因為域寬隻有1,如果接下來還有讀入的話,會給後面的讀入;
AC代碼
#include<bits/stdc++.h>
using namespace std;
int a[105][105],n,m,sum;
void dfs(int x,int y){
a[x][y]=0;
if(a[x-1][y]>0)dfs(x-1,y);
if(a[x][y+1]>0)dfs(x,y+1);
if(a[x+1][y]>0)dfs(x+1,y);
if(a[x][y-1]>0)dfs(x,y-1);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%1d",&a[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]>0){sum++;dfs(i,j);}
}
}
cout<<sum;
}
這是我第一篇題解有什麼不對的希望大神指出;