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

โปรแกรม C++ สร้างนิพจน์สมดุลที่ตำแหน่งที่กำหนดต้องเป็นวงเล็บเปิด

นิพจน์สมดุลของวงเล็บคือนิพจน์ที่มีคู่ของวงเล็บทุกประเภทด้วยกันในลำดับที่ถูกต้อง หมายความว่าสำหรับวงเล็บเปิดทุกอันจะต้องมีวงเล็บปิดในลำดับที่ถูกต้อง เช่น { }

นิพจน์ − {([][]{})({}[]{})}

ผลลัพธ์ − balanced

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

ในปัญหานี้ เราได้รับจำนวนเต็ม n และอาร์เรย์ตำแหน่งของวงเล็บความยาว 2n และเราต้องหาจำนวนนิพจน์สมดุลที่มีความยาว 2n โดยที่ตำแหน่งที่ทำเครื่องหมายด้วยวงเล็บเปิดจะต้องมีวงเล็บเปิด '{'

ตัวอย่าง −

Input: n = 2, position [1, 0, 0, 0]. Output: 2 Explanation: ผลลัพธ์ที่เป็นไปได้ทั้งหมดคือ: {{}}, {}{}.

อัลกอริทึม

  • ตำแหน่งทั้งหมดที่มีค่า 1 เป็นวงเล็บเปิด
  • ใช้ลูปแบบเรียกซ้ำ (recursive) ด้วยกฎต่อไปนี้
    • ถ้า (จำนวนวงเล็บเปิด - จำนวนวงเล็บปิด) < 0 คืนค่า 0
    • หลังลูปจนถึง n และถ้าจำนวนวงเล็บรวมหลัง push และ pop เป็น 0 คืนค่า 1 (ได้คำตอบ) มิฉะนั้นคืนค่า 0
    • ถ้ามีการกำหนด 1 ให้ล่วงหน้า ให้เรียกซ้ำด้วยการเพิ่มดัชนีและเพิ่มจำนวนวงเล็บรวม
    • มิฉะนั้น เรียกฟังก์ชันซ้ำโดยแทรกวงเล็บเปิดที่ตำแหน่งดัชนี แล้วแทรกวงเล็บปิดสำหรับมันและลดจำนวนวงเล็บรวมและไปดัชนีถัดไป

โปรแกรม

#include <bits/stdc++.h> 
using namespace std; 

int find(int index, int openbrk, int n, int expression[]){ 
    if (openbrk < 0) 
        return 0; 
    if (index == n){ 
        if (openbrk == 0) 
            return 1; 
        else 
            return 0; 
    } 
    if (expression[index] == 1) { 
        return find(index + 1, openbrk + 1, n, expression); 
    } else { 
        return find(index + 1, openbrk + 1, n, expression) + find(index + 1, openbrk - 1, n, expression); 
    } 
} 

int main() { 
    int n = 3; 
    int expression[6] = { 1, 0, 1, 0, 0, 0}; 
    cout << find(0, 0, 2 * n, expression) <<endl; 
    return 0; 
}

ผลลัพธ์

3