สมมติว่าเรามีเมทริกซ์ที่เต็มไปด้วยตัวอักษรสามตัว 'O', 'G' และ 'W' โดยที่ 'O' เป็นตัวแทนของพื้นที่เปิดโล่ง 'G' เป็นตัวแทนของยามและ 'W' เป็นตัวแทนของกำแพงในธนาคาร เราต้องแทนที่ตัว O ทั้งหมดในเมทริกซ์ด้วยระยะห่างที่สั้นที่สุดจากการ์ดเพียงตัวเดียว เราไม่สามารถทะลุผ่านกำแพงใดๆ ได้ ในการ์ดเมทริกซ์เอาต์พุตจะถูกแทนที่ด้วย 0 และกำแพงจะถูกแทนที่ด้วย -1
ดังนั้นหากอินพุตเป็นแบบ
O | O | O | O | G |
O | O | O | W | O |
O | W | O | O | O |
G | W | W | W | O |
O | O | O | O | G |
ผลลัพธ์จะเป็น
3 | 3 | 2 | 1 | 0 |
2 | 3 | 3 | -1 | 1 |
1 | -1 | 4 | 3 | 2 |
0 | -1 | -1 | -1 | 1 |
1 | 2 | 2 | 1 | 0 |
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ม :=5
-
ไม่มี :=5
-
dir_row :=[-1, 0, 1, 0]
-
dir_col :=[0, 1, 0, -1]
-
กำหนดฟังก์ชัน is_ok() นี่จะใช้เวลา i, j
-
ถ้า (i อยู่ในช่วง 0 และ M) หรือ (j ในช่วง 0 และ j N) แล้ว
-
คืนค่าเท็จ
-
-
คืนค่า True
-
กำหนดฟังก์ชัน isSafe() นี่จะใช้เวลา i, j,matrix, ผลลัพธ์
-
ถ้าเมทริกซ์[i, j] ไม่ใช่ 'O' หรือผลลัพธ์[i, j] ไม่ใช่ -1 แล้ว
-
คืนค่าเท็จ
-
-
คืนค่า True
-
กำหนดฟังก์ชัน calc_dist() ซึ่งจะใช้เมทริกซ์
-
ผลลัพธ์ :=สร้างเมทริกซ์ของคำสั่ง M x N และเติมด้วย -1
-
กำหนดคิวสองสิ้นสุด q
-
สำหรับผมอยู่ในช่วง 0 ถึง M ทำ
-
สำหรับ j ในช่วง 0 ถึง N ให้ทำ
-
ผลลัพธ์[i, j] :=-1
-
ถ้า matrix[i, j] เหมือนกับ 'G' แล้ว
-
ตำแหน่ง :=[i, j, 0]
-
แทรก pos ที่ด้านซ้ายของ q
-
ผลลัพธ์[i, j] :=0
-
-
-
-
ในขณะที่ขนาดของ q> 0 ไม่ใช่ศูนย์ ให้ทำ
-
curr :=ลบองค์ประกอบสุดท้ายออกจาก q
-
x, y, dist :=curr[0], curr[1], curr[2]
-
สำหรับผมอยู่ในช่วง 0 ถึง 3 ทำ
-
ถ้า is_ok(x + dir_row[i], y + dir_col[i]) ไม่เป็นศูนย์และ isSafe(x + dir_row[i], y + dir_col[i], matrix, result) ไม่เป็นศูนย์ ดังนั้นพี>
-
ผลลัพธ์[x + dir_row[i], y + dir_col[i]] :=dist + 1
-
ตำแหน่ง :=[x + dir_row[i], y + dir_col[i], dist + 1]
-
แทรก pos ที่ด้านซ้ายของ q
-
-
-
-
สำหรับผมอยู่ในช่วง 0 ถึง M ทำ
-
สำหรับ j ในช่วง 0 ถึง N ให้ทำ
-
แสดงผล[i, j]
-
-
ไปที่บรรทัดถัดไป
-
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from collections import deque as queue M = 5 N = 5 dir_row = [-1, 0, 1, 0] dir_col = [0, 1, 0, -1] def is_ok(i, j): if ((i < 0 or i > M - 1) or (j < 0 or j > N - 1)): return False return True def isSafe(i, j,matrix, result): if (matrix[i][j] != 'O' or result[i][j] != -1): return False return True def calculate_dist(matrix): result = [[ -1 for i in range(N)]for i in range(M)] q = queue() for i in range(M): for j in range(N): result[i][j] = -1 if (matrix[i][j] == 'G'): pos = [i, j, 0] q.appendleft(pos) result[i][j] = 0 while (len(q) > 0): curr = q.pop() x, y, dist = curr[0], curr[1], curr[2] for i in range(4): if is_ok(x + dir_row[i], y + dir_col[i]) and isSafe(x + dir_row[i], y + dir_col[i], matrix, result) : result[x + dir_row[i]][y + dir_col[i]] = dist + 1 pos = [x + dir_row[i], y + dir_col[i], dist + 1] q.appendleft(pos) for i in range(M): for j in range(N): if result[i][j] > 0: print(result[i][j], end=" ") else: print(result[i][j],end=" ") print() matrix = [['O', 'O', 'O', 'O', 'G'], ['O', 'O', 'O', 'W', 'O'], ['O', 'W', 'O', 'O', 'O'], ['G', 'W', 'W', 'W', 'O'], ['O', 'O', 'O', 'O', 'G']] calculate_dist(matrix)
อินพุต
[['O', 'O', 'O', 'O', 'G'], ['O', 'O', 'O', 'W', 'O'], ['O', 'W', 'O', 'O', 'O'], ['G', 'W', 'W', 'W', 'O'], ['O', 'O', 'O', 'O', 'G']]
ผลลัพธ์
3 3 2 1 0 2 3 3 -1 1 1 -1 4 3 2 0 -1 -1 -1 1 1 2 2 1 0