Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาจำนวนกลุ่มขั้นต่ำของหอสื่อสารใน C++


สมมติว่าเรามีเมทริกซ์ไบนารี 2D โดย 1 แทนหอสื่อสาร และ 0 แทนเซลล์ว่าง หอสื่อสารสามารถสื่อสารได้ดังนี้: 1. ถ้าหอ A และหอ B อยู่แถวเดียวกันหรือคอลัมน์เดียวกัน พวกเขาสามารถสื่อสารได้ 2. ถ้าหอ A พูดกับ B ได้ และ B พูดกับ C ได้ แล้ว A พูดกับ C ได้ (สมบัติข้ามถัด) เราต้องหาจำนวนกลุ่มหอสื่อสารทั้งหมด (กลุ่มคือรายการหอที่พูดกันได้)

เช่น ถ้าอินพุตเป็น:

110
001
101

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนต่อไปนี้:

  • กำหนดฟังก์ชัน dfs() รับเมทริกซ์ 2D, i, j, n, m

  • matrix[i][j] := 2

  • ลูป k จาก 1 ถึง n-1:

    • p := (i + k) mod n

    • q := j

    • ถ้า matrix[p][q] เป็น 1 ให้ dfs(matrix, p, q, n, m)

  • ลูป k จาก 1 ถึง m-1:

    • p := i

    • q = (j + k) mod m

    • ถ้า matrix[p][q] เป็น 1 ให้ dfs(matrix, p, q, n, m)

  • จากเมธอดหลัก:

  • n := ขนาดของเมทริกซ์

  • ans := 0

  • ลูป i จาก 0 ถึง n-1:

    • ลูป j จาก 0 ถึง m-1:

      • ถ้า matrix[i][j] เป็น 1 ให้:

        • เพิ่ม ans ขึ้น 1

        • dfs(matrix, i, j, n, m)

  • คืนค่า ans

ตัวอย่าง

#include <bits/stdc++.h> using namespace std; class Solution {    public:    void dfs(vector<vector<int>>& matrix, int i, int j, int& n, int& m) {       matrix[i][j] = 2;       for (int k = 1; k < n; k++) {          int p = (i + k) % n, q = j;          if (matrix[p][q] == 1) dfs(matrix, p, q, n, m);       }       for (int k = 1; k < m; k++) {          int p = i, q = (j + k) % m;          if (matrix[p][q] == 1) dfs(matrix, p, q, n, m);       }    }    int solve(vector<vector<int>>& matrix) {       int n = matrix.size(), m = matrix[0].size();       int ans = 0;       for (int i = 0; i < n; i++) {          for (int j = 0; j < m; j++) {             if (matrix[i][j] == 1) {                ans++;                dfs(matrix, i, j, n, m);             }          }       }       return ans;    } }; int solve(vector<vector<int>>& matrix) {    return (new Solution())->solve(matrix); } main(){    vector<vector<int>> v = {       {1,1,0},       {0,0,1},       {1,0,1}    };    cout << solve(v); }

อินพุต

{{1,1,0}, {0,0,1}, {1,0,1}};

เอาต์พุต

1