สมมติว่าเราได้ให้อาร์เรย์ 2 มิติ A ตอนนี้แต่ละเซลล์เป็น 0 (แสดงถึงทะเล) หรือ 1 (แสดงถึงแผ่นดิน) ในที่นี้ การเคลื่อนไหวประกอบด้วยการเดินจากสี่เหลี่ยมผืนดินหนึ่ง 4 ทิศทางไปยังอีกตารางหนึ่ง หรือนอกขอบเขตของตาราง เราต้องหาจำนวนช่องสี่เหลี่ยมในตารางที่เราไม่สามารถเดินออกจากขอบเขตของตารางในการเคลื่อนไหวจำนวนเท่าใดก็ได้ ดังนั้นหากกริดเป็นเหมือน −
0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 0 | 0 | 0 |
คำตอบจะเป็น 3 เนื่องจากมีสามตัวที่เติมด้วย 0 และตัวที่ 1 ไม่ได้ปิดล้อม
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้าง dir อาร์เรย์ทิศทาง และเก็บ [[1,0], [-1,0], [0,1], [0,-1]]
-
สร้างเมธอดที่เรียกว่า dfs() ซึ่งจะใช้ x, y และเมทริกซ์ A
-
ถ้า x <0 หรือ y> 0 หรือ x> จำนวนแถวของ A หรือ y> จำนวนคอลัมน์ของ A หรือ A[x, y] เป็น 0 ให้ส่งคืน
-
ตั้งค่า A[x, y] :=0
-
สำหรับ k ในช่วง 0 ถึง 3
-
nx :=dir[k, 0] + x, ny :=dir[k, 1] + y
-
dfs(nx, ny, A)
-
-
จากวิธีหลักให้ทำดังนี้
-
ret :=0, n :=จำนวนแถวของ A
-
m :=จำนวนคอลัมน์ของ A ถ้า n ไม่ใช่ 0 มิฉะนั้น m :=0
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
ถ้า A[i, 0] =1 ให้เรียก dfs(i, 0, A)
-
ถ้า A[i, m – 1] เป็น 1 ให้เรียก dfs(i, m – 1, A)
-
-
สำหรับฉันในช่วง 0 ถึง m – 1
-
ถ้า A[0, i] =1 ให้เรียก dfs(0, i, A)
-
ถ้า A[n – 1, i] คือ 1 ให้เรียก dfs(n – 1, i, A)
-
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
สำหรับ j ในช่วง 0 ถึง m – 1
-
ret :=ret + A[i, j]
-
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; class Solution { public: void dfs(int x, int y, vector < vector <int>>& A){ if(x < 0 || y < 0 || x >= A.size() || y >= A[0].size() || A[x][y] == 0) return; A[x][y] = 0; for(int k = 0; k < 4; k++){ int nx = dir[k][0] + x; int ny = dir[k][1] + y; dfs(nx, ny, A); } } int numEnclaves(vector<vector<int>>& A) { int ret = 0; int n = A.size(); int m = n ? A[0].size() : 0; for(int i = 0; i < n; i++){ if(A[i][0] == 1){ dfs(i, 0, A); } if(A[i][m - 1] == 1){ dfs(i, m - 1, A); } } for(int i = 0; i < m; i++){ if(A[0][i] == 1){ dfs(0, i, A); } if(A[n - 1][i] == 1){ dfs(n - 1, i, A); } } for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ ret += A[i][j]; } } return ret; } }; main(){ vector<vector<int>> v1 = {{0,0,0,0},{1,0,1,0},{0,1,1,0},{0,0,0,0}}; Solution ob; cout << (ob.numEnclaves(v1)); }
อินพุต
[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
ผลลัพธ์
3