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

ค้นหาเส้นรอบรูปของรูปร่างที่เกิดขึ้นจาก 1 วินาทีในเมทริกซ์ไบนารีใน C++


ในปัญหานี้ เราได้รับไบนารีเมทริกซ์ bin[][] ขนาด nXm ซึ่งประกอบด้วย 0 และ 1 เท่านั้น งานของเราคือค้นหาขอบเขตของรูปร่างที่เกิดขึ้นจาก 1s ในเมทริกซ์ไบนารี

เส้นรอบวงที่ถ่ายจะครอบคลุมร่างจากทุกด้านเช่น

สำหรับ 1 ค่าเดียว เส้นรอบรูปคือ 4

ค้นหาเส้นรอบรูปของรูปร่างที่เกิดขึ้นจาก 1 วินาทีในเมทริกซ์ไบนารีใน C++

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

bin[][] = [1, 0]
   [1, 0]

ผลลัพธ์

6

คำอธิบาย

เซลล์ (0,0) และ (1, 0) เชื่อมต่อกันโดยให้สี่เหลี่ยมด้านที่ 2 และ 1 เส้นรอบรูปคือ 6

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาง่ายๆ ก็คือการค้นหาทั้งหมดหนึ่งข้อและการมีส่วนร่วมของพวกมันในขอบเขต แล้วบวกทั้งหมดเพื่อค้นหาค่า

การมีส่วนร่วมของ 1 ต่อปริมณฑลในเมทริกซ์คือ การมีส่วนร่วมสูงสุดคือ 4 เมื่อ 1 เพียงอย่างเดียวมีส่วนในปริมณฑล

การบริจาคขั้นต่ำคือ 0 เมื่อ 1 ถูกล้อมรอบด้วย 1 ทุกด้าน

ดังนั้น สำหรับแต่ละองค์ประกอบของเมทริกซ์ เราต้องตรวจสอบว่ามันเป็น 1 หรือไม่ สำหรับ all1 เราจะหาเพื่อนบ้าน จากนั้นจึงมีส่วนร่วมในปริมณฑลและสุดท้ายคือปริมณฑล

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

#include<iostream>
using namespace std;
#define R 3
#define C 5
int contibutionToPerimeter(int mat[][C], int i, int j) {
   int neighbours = 0;
   if (i > 0 && mat[i - 1][j])
      neighbours++;
   if (j > 0 && mat[i][j - 1])
      neighbours++;
   if (i < R-1 && mat[i + 1][j])
      neighbours++;
   if (j < C-1 && mat[i][j + 1])
      neighbours++;
   return (4 - neighbours);
}
int calcPerimeter(int mat[R][C]){
   int perimeter = 0;
   for (int i = 0; i < R; i++)
      for (int j = 0; j < C; j++)
         if (mat[i][j] == 1)
            perimeter += contibutionToPerimeter(mat, i ,j);
   return perimeter;
}
int main() {
   int mat[R][C] = { {0, 1, 0, 0, 0},
   {1, 1, 1, 1, 0},
   {1, 1, 0, 1, 1} };
   cout<<"The perimeter of shapes from formed with 1s is "<<calcPerimeter(mat);
   return 0;
}

ผลลัพธ์

The perimeter of shapes from formed with 1s is 18