กำหนดกริดที่มีเซลล์ 2 ประเภท: สีดำ (#) และสีขาว (.) ในแต่ละรอบ จะเปลี่ยนเซลล์สีขาวที่ติดกับเซลล์สีดำ (แนวนอน/แนวตั้ง) ให้กลายเป็นสีดำ ทำซ้ำจนกว่าทุกเซลล์จะเป็นสีดำ ต้องการหาจำนวนรอบที่ใช้ (กริดเริ่มต้นต้องมีเซลล์ดำอย่างน้อย 1 เซลล์)
ตัวอย่าง: h = 4, w = 4, grid = {"#...", ".#..", "....", "...#"} ผลลัพธ์คือ 3 ใช้ 3 รอบในการเปลี่ยนทั้งหมดเป็นสีดำ
ขั้นตอนการแก้ปัญหา (BFS หลายแหล่งที่มา)
- กำหนดทิศทาง 4 ด้าน:
dx = {1,0,-1,0},dy = {0,1,0,-1} - สร้างอาร์เรย์
distanceเริ่มต้น -1 และคิวq - ใส่เซลล์สีดำทั้งหมดเข้าคิว พร้อมตั้ง
distance = 0 - BFS: ดึงเซลล์จากคิว ตรวจสอบ 4 ทิศทาง ถ้าเป็นเซลล์สีขาวและยังไม่ได้ไป (
distance == -1) ตั้งdistance = distance[ปัจจุบัน] + 1ใส่คิว - คำตอบคือค่า
distanceสูงสุดในกริด
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void solve(int h, int w, vector<string> grid) {
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
vector<vector<int>> distance(h, vector<int>(w, -1));
queue<pair<int, int>> q;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (grid[i][j] == '#') {
distance[i][j] = 0;
q.push({i, j});
}
}
}
while (!q.empty()) {
auto now = q.front(); q.pop();
for (int dir = 0; dir < 4; dir++) {
int cx = now.first + dx[dir];
int cy = now.second + dy[dir];
if (cx < 0 || cx >= h || cy < 0 || cy >= w) continue;
if (distance[cx][cy] == -1) {
distance[cx][cy] = distance[now.first][now.second] + 1;
q.push({cx, cy});
}
}
}
int ans = 0;
for (int i = 0; i < h; ++i)
for (int j = 0; j < w; ++j)
ans = max(ans, distance[i][j]);
cout << ans << endl;
}
int main() {
int h = 4, w = 4;
vector<string> grid = {"#...", ".#..", "....", "...#"};
solve(h, w, grid);
return 0;
}
อินพุต / เอาต์พุต
Input: 4, 4, {"#...", ".#..", "....", "...#"}
Output: 3