Computer >> Máy Tính >  >> Lập trình >> C ++

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

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

Nếu gương ở 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ư thể hiện trong hình bên dưới.

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

Đầ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

No. of mirrors : 3

Giải thích - Như hình bên. Có thể đặt gương ở các ô

Arr [1] [0] - hàng 1 và cột 0 có tất cả số 0 bên dưới và bên phải của nó.

Arr [2] [0] - hàng 2 và cột 0 có tất cả số 0 bên dưới và bên phải của nó.

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

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Mảng Arr [] [] được sử dụng để biểu diễn ma trận của 0 và 1 ..

  • Hàm MaximumMirror (int mat [] [], int n) nhận ma trận và nó ở phía n làm đầu vào và trả về số lượng các gương tối đa có thể được đặt như hình trên.

  • Cờ biến được sử dụng để đánh dấu sự hiện diện của chướng ngại vật trong các ô bên dưới hoặc các ô bên phải arr [i] [j].

  • Số đếm được sử dụng để biểu thị số lượng gương, ban đầu là 0.

  • Ma trận đảo chiều từ chỉ số 0,0.

  • Đối với mỗi ô nếu nó trống (có thể đặt gương), hãy kiểm tra các ô bên dưới (k =i + 1 đến n-1). Nếu bất kỳ arr [k] [j] nào là chướng ngại vật (giá trị =1) thì ngắt trong khi lặp lại và đánh dấu cờ là 1. Nếu không, hãy tiếp tục kiểm tra các ô ở bên phải (l =j + 1 đến n-1).

  • Đặt cờ trong trường hợp có chướng ngại vật.

  • Sau cả hai vòng lặp while nếu cờ là 0 thì có thể đặt số gia tăng như nhân bản.

  • Trả lại tính là không. trong số các gương có giá trị tối đa.

Ví dụ

// C++ program to find how many mirrors can transfer
// light from bottom to right
#include <bits/stdc++.h>
using namespace std;
// method returns number of mirror which can transfer
// light from bottom to right
int maximumMirror(int mat[5][5], int N){
   // to mark that all cells in the right or bottom are 0---no obstacle
   int flag=0;
   int count=0; //count of mirrors
   int i,j,k,l;
   //for all cells
   for (int i=0; i<N; i++)
      for(j=0;j<N;j++){
   //check from next column and next row
   int k=i+1;
   int l=j+1;
   if(mat[i][j]==0) //position for mirror{
      while(k<N) //check for rows below{
         if(mat[k][j]==1) //keeping column fixed, if there is obstacle break{
            flag=0; break; }
      else
         flag=1;
         k++;
      }
      if(flag==1) //if no obstacle in rows then check columns in right
         while(l<N) //checking for columns in right{
            if(mat[i][l]==1) //keep row fixed, if obstacle break{
               flag=0; break;
         }
         else
            flag=1;
            l++;
         }
         if(flag==1) //there is no obstacle for mirror mat[i][j]
            count++;
      }
   }
   return count;
}
int main(){
   int N = 5;
   //matrix where 1 represents obstacle form 5X5 matrix
   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 <<"Maximum mirrors which can transfer light from bottom to right :"<<
   maximumMirror(mat, N) << endl;
   return 0;
}

Đầu ra

Maximum mirrors which can transfer light from bottom to right :3