สมมติว่าเรามีเมทริกซ์ไบนารี 2 มิติ โดยที่ 1 แทนหอสื่อสาร และ 0 แทนเซลล์ว่าง หอคอยสามารถสื่อสารได้ดังนี้:1. หากหอคอย A และหอคอย B อยู่ในแถวหรือคอลัมน์เดียวกันก็สามารถสื่อสารกันได้ 2. หากหอคอย A สามารถพูดคุยกับหอคอย B และ B สามารถพูดคุยกับ C ได้ A สามารถพูดคุยกับ C (คุณสมบัติสกรรมกริยา) เราต้องหาจำนวนหอคอยทั้งหมดที่มีอยู่ (นี่คือกลุ่มของหอคอยที่สามารถพูดคุยกันได้)
ดังนั้นหากอินพุตเป็นแบบ
1 | 1 | 0 |
0 | 0 | 1 |
1 | 0 | 1 |
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
-
กำหนดฟังก์ชัน dfs() ซึ่งจะใช้เมทริกซ์อาร์เรย์ 2 มิติหนึ่งตัว i, j, n, m,
-
เมทริกซ์[i, j] :=2
-
สำหรับการเริ่มต้น k :=1 เมื่อ k
-
p :=(i + k) mod n
-
q :=เจ
-
ถ้า matrix[p, q] เหมือนกับ 1 แล้ว:
-
dfs(เมทริกซ์, p, q, n, m)
-
-
-
สำหรับการเริ่มต้น k :=1 เมื่อ k
-
p :=ผม
-
q =(j + k)
-
ถ้า matrix[p, q] เหมือนกับ 1 แล้ว:
-
dfs(เมทริกซ์, p, q, n, m)
-
-
-
จากวิธีหลัก ให้ทำดังนี้:
-
n :=ขนาดของเมทริกซ์
-
ตอบ :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ถ้า matrix[i, j] เหมือนกับ 1 แล้ว:
-
(เพิ่มขึ้นทีละ 1)
-
dfs(เมทริกซ์, ผม, เจ, n, ม.)
-
-
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:
ตัวอย่าง
#includeใช้เนมสเปซ std;class Solution { public:void dfs(vector >&matrix, int i, int j, int&n, int&m) { matrix[i ][j] =2; สำหรับ (int k =1; k >&เมทริกซ์) { int n =matrix.size(), m =matrix[0].size(); int ans =0; for (int i =0; i >&เมทริกซ์) { ส่งคืน (โซลูชันใหม่())->แก้ (เมทริกซ์);}หลัก(){ vector > v ={ {1,1 ,0}, {0,0,1}, {1,0,1} }; ศาล <<แก้ (v);}
อินพุต
<ก่อน>{{1,1,0},{0,0,1},{1,0,1}};ผลลัพธ์
1