Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Số gương tối đa có thể truyền ánh sáng từ dưới lên phải trong C++


Chúng ta được cho một ma trận vuông chỉ chứa 0 và 1. 0 đại diện cho nơi trống và 1 có nghĩa là chướng ngại vật. Chúng ta phải tìm số gương có thể đặt tại các ô trống sao cho các gương này có thể truyền ánh sáng từ dưới lên phải. Điều này có thể khi gương đặt tại chỉ số [i,j] và tất cả các ô bên phải trong hàng đó (i) và các ô ở dưới (j) trong cột đó không có chướng ngại vật.

Nếu gương tại A[i][j], thì tất cả A[i+1 đến n][j] và A[i][j+1 đến n] đều trống tức là 0. Như hình dưới đây.

Số gương tối đa có thể truyền ánh sáng từ dưới lên phải trong C++

Ví dụ

Đầu vào

Arr[][] = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,1,1,0,1},{1,1,1,0,1}}

Đầu ra

Số gương: 3

Giải thích − Như hình vẽ. Gương có thể đặt tại các ô:

Arr[1][0] − hàng 1 và cột 0 toàn 0 bên dưới và bên phải.

Arr[2][0] − hàng 2 và cột 0 toàn 0 bên dưới và bên phải.

Arr[4][4] − Ô cuối cùng, là 0 và không có hàng dưới, cột phải.

Phương pháp sử dụng trong chương trình dưới đây

  • Mảng Arr[][] biểu diễn ma trận 0 và 1.
  • Hàm maximumMirror(int mat[][], int n) nhận ma trận và cạnh n, trả về số gương tối đa có thể đặt như trên.
  • Biến flag đánh dấu sự hiện diện chướng ngại vật trong ô dưới hoặc ô phải của arr[i][j].
  • Count đại diện cho số gương, khởi tạo 0.
  • Duyệt ma trận từ chỉ số 0,0.
  • Với mỗi ô nếu trống (có thể đặt gương), kiểm tra ô dưới (k=i+1 đến n-1). Nếu bất kỳ arr[k][j] là chướng ngại vật (giá trị=1) thì thoát vòng while và đặt flag=1. Nếu không, tiếp tục kiểm tra ô bên phải (l=j+1 đến n-1).
  • Đặt flag nếu có chướng ngại vật.
  • Sau cả hai vòng while nếu flag là 0 thì tăng count vì gương có thể đặt.
  • Trả về count là số gương tối đa.

Ví dụ mã nguồn

// C++ program to find how many mirrors can transfer
// light from bottom to right
#include <bits/stdc++.h> 
using namespace std; 

// Phương thức trả về số gương có thể truyền
// ánh sáng từ dưới lên phải
int maximumMirror(int mat[5][5], int N) { 
    // đánh dấu tất cả ô bên phải hoặc dưới là 0 - không chướng ngại
    int flag = 0; 
    int count = 0; // số gương
    int i, j, k, l; 
    // với tất cả ô
    for (int i = 0; i < N; i++) 
        for (j = 0; j < N; j++) { 
            // kiểm tra từ cột tiếp theo và hàng tiếp theo
            int k = i + 1; 
            int l = j + 1; 
            if (mat[i][j] == 0) { // vị trí cho gương
                while (k < N) { // kiểm tra hàng dưới
                    if (mat[k][j] == 1) { // cột cố định, nếu có chướng ngại vật break
                        flag = 0; 
                        break; 
                    } 
                    else 
                        flag = 1; 
                    k++; 
                } 
                if (flag == 1) { // nếu không chướng ngại vật hàng thì kiểm tra cột bên phải
                    while (l < N) { // kiểm tra cột bên phải
                        if (mat[i][l] == 1) { // hàng cố định, nếu chướng ngại vật break
                            flag = 0; 
                            break; 
                        } 
                        else 
                            flag = 1; 
                        l++; 
                    } 
                    if (flag == 1) { // không chướng ngại vật cho gương mat[i][j]
                        count++; 
                    } 
                } 
            } 
        } 
    return count; 
} 

int main() { 
    int N = 5; 
    // ma trận 1 là chướng ngại vật từ ma trận 5x5
    int mat[5][5] = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,1,1,0,1},{1,1,1,0,1}}; 
    cout << "Số gương tối đa truyền ánh sáng từ dưới lên phải: " 
         << maximumMirror(mat, N) << endl; 
    return 0; 
}

Kết quả

Số gương tối đa truyền ánh sáng từ dưới lên phải: 3