赞
踩
- #include <bits/stdc++.h>
- #define endl "\n"
- using namespace std;
- int m, n;
- int dx[4] = {0,-1,0,1};
- int dy[4] = {-1,0,1,0};
-
- int dxx[8] = {0,-1,0,1,-1,-1,1,1};
- int dyy[8] = {-1,0,1,0,-1,1,-1,1};
-
- int res = 0;
- void dfs_road(vector<vector<char>> &grid,int x,int y,vector<vector<bool>> &visited)
- {
- visited[x][y] = true;
- for(int i = 0;i < 4;i++)
- {
- int nextx = x + dx[i];
- int nexty = y + dy[i];
- if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
- if(!visited[nextx][nexty] && grid[nextx][nexty] == '1')
- {
- visited[nextx][nexty] = true;
- dfs_road(grid,nextx,nexty,visited);
- }
- }
- }
- //
- void dfs_sea(vector<vector<char>> &grid,int x,int y,vector<vector<bool>> &visited)
- {
- visited[x][y] = true;
- for(int i = 0;i < 8;i++)
- {
- int nextx = x + dxx[i];
- int nexty = y + dyy[i];
- if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
- if(!visited[nextx][nexty] && grid[nextx][nexty] == '1')
- {
- visited[nexty][nexty] = true;
- dfs_road(grid,nextx,nexty,visited);
- res++;
- }
- if(!visited[nextx][nexty] && grid[nextx][nexty] == '0')
- {
- visited[nextx][nexty] = true;
- dfs_sea(grid,nextx,nexty,visited);
- }
- }
- }
- void solve()
- {
- cin >> m >>n;
- res = 0;
- vector<vector<char>> grid(m,vector<char>(n));
- vector<vector<bool>> visited = vector<vector<bool>>(m,vector<bool>(n,false));
- for(int i = 0;i < m;i++)
- {
- for(int j = 0;j < n;j++)
- {
- cin >> grid[i][j];
- }
- }
- //从边缘遍历岛屿
- for(int i = 0;i < m;i++)
- {
- if(!visited[i][0] && grid[i][0] == '1')
- {
- dfs_road(grid,i,0,visited);
- res++;
- }
- if(!visited[i][n - 1] && grid[i][n - 1] == '1')
- {
- dfs_road(grid,i,n - 1,visited);
- res++;
- }
- }
- for(int j = 0;j < n;j++)
- {
- if(!visited[0][j] && grid[0][j] == '1')
- {
- dfs_road(grid,0,j,visited);
- res++;
- }
- if(!visited[m - 1][j] && grid[m - 1][j] == '1')
- {
- dfs_road(grid,m - 1,j,visited);
- res++;
- }
- }
- //从边缘的海遍历 遇见没有遍历过的陆地再做dfs
- for(int i = 0;i < m;i++)
- {
- if(!visited[i][0] && grid[i][0] == '0')
- {
- dfs_sea(grid,i,0,visited);
- }
- //
- if(!visited[i][n - 1] && grid[i][n - 1] == '0')
- {
- dfs_sea(grid,i,n - 1,visited);
- }
- }
- for(int j = 0;j < n;j++)
- {
- if(!visited[0][j] && grid[0][j] == '0')
- {
- dfs_sea(grid,0,j,visited);
- }
- //
- if(!visited[m - 1][j] && grid[m - 1][j] == '0')
- {
- dfs_sea(grid,m - 1,j,visited);
- }
- }
- cout << res << endl;
- }
- signed main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int t = 1;
- cin >> t;
- while(t--)
- solve();
- return 0;
- }
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。