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

กระจกสูงสุดที่สามารถถ่ายโอนแสงจากด้านล่างไปขวาใน C++


เราได้ตารางเมทริกซ์ซึ่งประกอบด้วย 0 และ 1 เท่านั้น 0 หมายถึงสถานที่ว่างเปล่าและ 1 หมายถึงสิ่งกีดขวาง เราต้องหากระจกจำนวนหนึ่งที่สามารถวางเซลล์ atempty เพื่อให้กระจกเหล่านี้สามารถถ่ายโอนแสงจากด้านล่างไปขวาได้ สิ่งนี้เป็นไปได้เมื่อวางกระจกไว้ที่ดัชนี [i,j] และสำหรับเซลล์ทั้งหมดทางด้านขวาในแถวนั้น ( i ) และเซลล์ที่อยู่ด้านล่าง ( j ) ในคอลัมน์นั้นไม่มีสิ่งกีดขวาง

หากกระจกอยู่ที่ A[i][j] ดังนั้น A[i+1 ถึง n][ j ] และ A[ i ][ j+1 ถึง n ] ทั้งหมดจะว่างเปล่า กล่าวคือ 0 ดังแสดงในรูปด้านล่าง

กระจกสูงสุดที่สามารถถ่ายโอนแสงจากด้านล่างไปขวาใน C++

อินพุต

<ก่อนหน้า>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}}

ผลลัพธ์

No. ของกระจก :3

คำอธิบาย - ดังแสดงในรูป สามารถติดกระจกไว้ที่เซลล์ได้

Arr[1][0] - แถวที่ 1 และคอลัมน์ 0 มี 0 อยู่ด้านล่างและด้านขวาทั้งหมด

Arr[2][0] - แถวที่ 2 และคอลัมน์ 0 มี 0 อยู่ด้านล่างและด้านขวาทั้งหมด

Arr[4][4] − เซลล์สุดท้าย คือ 0 และไม่มีแถวด้านล่างและคอลัมน์ทางด้านขวา

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

  • Array Arr[][] ใช้แทนเมทริกซ์ของ 0 และ 1 ..

  • ฟังก์ชั่น maximumMirror(int mat[][], int n) รับเมทริกซ์และอยู่ด้าน n เป็นอินพุตและส่งกลับจำนวนกระจกสูงสุดที่สามารถวางได้ตามที่แสดงด้านบน

  • แฟล็กตัวแปรใช้เพื่อทำเครื่องหมายการมีอยู่ของสิ่งกีดขวางในเซลล์ด้านล่างหรือเซลล์ทางด้านขวาของ arr [i] [j]

  • Count ใช้แทนจำนวนมิเรอร์ เริ่มแรก 0 .

  • เมทริกซ์การเคลื่อนที่จากดัชนี 0,0

  • สำหรับแต่ละเซลล์ถ้ามันว่างเปล่า (สามารถวางกระจกได้) ให้ตรวจสอบเซลล์ด้านล่าง ( k=i+1 ถึง n-1) หากมี arr[k][j] เป็นสิ่งกีดขวาง (value=1 ) ให้แบ่งในขณะที่ วนซ้ำและทำเครื่องหมายแฟล็กเป็น 1 หากไม่ ให้ตรวจสอบเซลล์ทางด้านขวาต่อไป ( l=j+1 ถึง n-1 )

  • ตั้งธงในกรณีที่มีสิ่งกีดขวาง

  • หลังจากทั้งคู่ while วนซ้ำหากแฟล็กเป็น 0 แล้วการเพิ่มขึ้นจะนับเป็นมิเรอร์ได้

  • นับกลับเป็นเลขที่ ของกระจกสูงสุด

ตัวอย่าง

// โปรแกรม C++ เพื่อค้นหาจำนวนกระจกที่สามารถถ่ายโอน// แสงจากล่างขึ้นบนขวา#include โดยใช้เนมสเปซ std;// วิธีการคืนค่าจำนวนมิเรอร์ที่สามารถถ่ายโอนได้// แสงจากล่างขึ้นบน rightint maximumMirror(int mat[5][5], int N){ // เพื่อทำเครื่องหมายว่าเซลล์ทั้งหมดทางด้านขวาหรือด้านล่างเป็น 0--- ไม่มีสิ่งกีดขวาง int flag=0; จำนวน int=0; //นับกระจก int i,j,k,l; //สำหรับเซลล์ทั้งหมดสำหรับ (int i=0; i 

ผลลัพธ์

กระจกมองข้างสูงสุดที่สามารถถ่ายโอนแสงจากล่างขึ้นขวา :3