1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> #define x first #define y second #define endl '\n'
using namespace std; using PII = pair<int, int>;
const int N = 60;
int dx[] = {0, 0, -1, 1}; int dy[] = {1, -1, 0, 0};
int ddx[] = {0, 0, -1, 1, -1, 1, -1, 1}; int ddy[] = {1, -1, 0, 0, 1, 1, -1, -1};
int g[N][N]; int ans; int n, m;
bool vis_sea[N][N]; bool vis_road[N][N];
bool inmp(int x, int y) { return x >= 0 && y >= 0 && x < n && y < m; }
void road_bfs(int sx, int sy) { queue<PII> q; q.push({sx, sy}); vis_road[sx][sy] = true; while(q.size()) { auto t = q.front(); q.pop(); for(int i = 0;i < 4;i ++) { int nx = t.x + dx[i], ny = t.y + dy[i]; if(inmp(nx, ny) && g[nx][ny] == 1 && !vis_road[nx][ny]) { vis_road[nx][ny] = true; q.push({nx, ny}); } } } }
void sea_bfs(int sx, int sy) { queue<PII> q; q.push({sx, sy}); vis_sea[sx][sy] = true; while(q.size()) { auto t = q.front(); q.pop(); for(int i = 0;i < 8;i ++) { int nx = t.x + ddx[i], ny = t.y + ddy[i]; if(inmp(nx, ny) && g[nx][ny] == 0 && !vis_sea[nx][ny]) { vis_sea[nx][ny] = true; q.push({nx, ny}); } if(inmp(nx, ny) && g[nx][ny] == 1 && !vis_road[nx][ny]) { ans ++; road_bfs(nx, ny); } } } }
void solve() { cin >> n >> m; ans = 0; for(int i = 0;i < n;i ++) for(int j = 0;j < m;j ++) vis_sea[i][j] = vis_road[i][j] = false; for(int i = 0; i < n;i ++) { string s; cin >> s; for(int j = 0;j < m;j ++) { g[i][j] = s[j] - '0'; } } bool flag = false; for(int i = 0;i < n;i ++) for(int j = 0;j < m; j ++) { if(i == 0 || i == n - 1 || j == 0 || j == m - 1) { if(vis_sea[i][j] == false && g[i][j] == 0) { flag = true; sea_bfs(i, j); } } } if(!flag) ans = 1; cout << ans << endl; }
int main() { int t; cin >> t; while(t --) solve(); return 0; }
|