【OJ】1082: 水池
阿新 • • 發佈:2018-11-25
這一題也是BFS的問題,這一題最關鍵的是:
每呼叫一次BFS,就將所有水池的位置全部改成0,這樣呼叫BFS多少次,就有多少個水池。
具體分析且見程式碼:
#include<stdio.h> #include<algorithm> #include<queue> using namespace std; // 定義狀態 struct Status { int x; int y; }; // 儲存地圖 int map[110][110]; // 標誌地圖中的每個點是否被訪問過 如果訪問過則為true bool mark[110][110]; // 四個方向 ----> 上下左右 int go[][2] = { 1,0, -1,0, 0,1, 0,-1 }; bool check(int x, int y, int n, int m) {// 檢查位置(x,y)是否能訪問 if (x<1 || x>n || y<1 || y>m||map[x][y]==0) { return false; } return true; } void BFS(int x, int y, int n, int m) { // 程式設計中要重視初始化的工作 queue<Status>Q; map[x][y] = 0; // 這一步將進來的那個初始位置改成0 Status head; head.x = x; head.y = y; Q.push(head); while (!Q.empty()) { Status cur = Q.front(); Q.pop(); for (int i = 0; i < 4; i++) {// 四個方向 int nx = cur.x + go[i][0]; int ny = cur.y + go[i][1]; if (check(nx, ny, n, m)) { Status t; t.x = nx; t.y = ny; Q.push(t); map[nx][ny] = 0; // 將位置(nx,ny)改成0 } } } } int main() { int T; scanf("%d", &T); while (T--) {// 共要執行T次 // 清除上一次的輸入 for (int i = 0; i < 110; i++) { for (int j = 0; j < 110; j++) { mark[i][j] = false; map[i][j] = -1; } } // 進入本次輸入 int n = 0; int m = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &map[i][j]); } } // ret 用來儲存答案 int ret = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (map[i][j] == 1) { ret++; BFS(i, j, n, m);// 每呼叫一次BFS,就將所有水池的位置全部改成0! } } } printf("%d\n", ret); } return 0; }
路漫漫其修遠兮,吾將上下而求索!