简单做下dfs的题目,太简单了,大家自己体会吧,已经懒得写思路了
#include "iostream" #include "stdio.h" #include "vector" using namespace std; const int N = 1e5 + 10; int dir[4][2] = {0, -1, 0, 1, -1, 0, 1, 0}; vector<int> a[N], vis[N]; int n, m; int ans = 0, res = 0; bool flag = false; void dfs(int i, int j){ vis[i][j] = 1; if(a[i][j] >=2) flag = true; for(int k = 0 ; k < 4; k ++){ int x = i + dir[k][0], y = j + dir[k][1]; if(x < 0 || x >= n || y < 0 || y >= m || vis[x][y] || !a[x][y] ) continue; dfs(x, y); } vis[i][j] = 0; a[i][j] = 0;//已经搜过的岛屿就不能再被搜了,因为是等一个岛屿全部搜索完才能标记,所以放到四个方向后面,代表这个陆地已经完完全全被搜过了,也就是搜索后标记 } int main(){ cin>>n>>m; int x; for(int i = 0 ; i< n; i++){ for(int j = 0 ; j < m; j++){ scanf("%1d",&x); a[i].push_back(x); vis[i].push_back(0); } } for(int i = 0 ; i < n; i++){ for(int j = 0 ;j < m; j++){ if(a[i][j]) { flag = false; dfs(i,j); if(flag) res ++; ans ++; } } } cout<<ans<<" "<<res<<endl; return 0; }
大家加油,昨天被小鱼哥鼓励到了,一定要努力努力啊!!!大家也一定要在自己的方向上不断加油啊!!