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

นับจำนวนวิธีไปถึงคะแนนที่กำหนดในเมทริกซ์ใน C++

กำหนดเมทริกซ์[][] แบบสี่เหลี่ยมจัตุรัสที่มีตัวเลขไม่ติดลบเป็นสมาชิก ยังมีตัวแปร score อีกตัว เป้าหมายคือนับวิธีไปถึงคะแนนที่กำหนดโดยการบวกสมาชิกจาก matrix[][] โดยที่การเคลื่อนที่ที่อนุญาตคือขวาและล่างเท่านั้น

เริ่มจาก matrix[0][0] การเคลื่อนที่ที่เป็นไปได้คือไป matrix[0][1] (ขวา) หรือ matrix[1][0] (ล่าง) และบวกค่าเพื่อให้ผลรวม = score

ทำความเข้าใจด้วยตัวอย่าง

ตัวอย่าง

Input - matrix[row][col] = {{1, 1}, {1, 1}} score = 3

Output - จำนวนวิธีไปถึงคะแนนที่กำหนดในเมทริกซ์คือ: 2

คำอธิบาย - คะแนนสามารถไปถึงได้ด้วยวิธีต่อไปนี้:

วิธี 1: บวกสมาชิกที่ดัชนี (0,0) + (0,1) + (1,1) = 1+1+1 = 3

วิธี 2: บวกสมาชิกที่ดัชนี (0,0) + (1,0) + (1,1) = 1+1+1 = 3

Input - matrix[row][col] = {{1,1,2}, {2,1,1}, {1,2,2}} score = 7

Output - จำนวนวิธีไปถึงคะแนนที่กำหนดในเมทริกซ์คือ: 2

คำอธิบาย - คะแนนสามารถไปถึงได้ด้วยวิธีต่อไปนี้:

วิธี 1: บวกสมาชิกที่ดัชนี (0,0) + (0,1) + (1,1) + (1,2) + (2,2) = 1+1+1+2+2 = 7

วิธี 2: บวกสมาชิกที่ดัชนี (0,0) + (0,1) + (1,1) + (2,1) + (2,2) = 1+1+1+2+2 = 7

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

ในแนวทางนี้ เราจะใช้ dynamic programming เพื่อแก้ปัญหา เราจะใช้อาร์เรย์สองอาร์เรย์ arr[row][col][size] และ check[row][col][size] อาร์เรย์ check จะทำเครื่องหมายเซลล์ของ matrix[][] ว่าเยี่ยมชมแล้วเป็น true อาร์เรย์ arr[][][] ใช้เก็บจำนวนวิธีไปถึงเซลล์เฉพาะจาก matrix[0][0] เราจะคำนวณวิธีแบบเรียกซ้ำ

  • รับอาร์เรย์ 2D matrix สำหรับเก็บตัวเลข
  • รับตัวแปร score เป็นอินพุต
  • รับอาร์เรย์สองอาร์เรย์ int arr[row][col][size] และ bool check[row][col][size]
  • ฟังก์ชัน matrix_score(int matrix[row][col], int rows, int cols, int sc) ใช้คืนค่าจำนวนวิธีไปถึงคะแนนที่กำหนดในเมทริกซ์
  • ถ้าคะแนน sc น้อยกว่า 0 คืนค่า 0 (เพื่อจบการเรียกซ้ำ หรือกรณีอินพุตผิด)
  • ถ้าจำนวนแถวหรือคอลัมน์น้อยกว่า 0 คืนค่า 0 (เพื่อจบการเรียกซ้ำ)
  • ถ้าเซลล์แรกเท่ากับ sc (คะแนนอินพุต) คืนค่า 1 เป็นวิธีเดียว ถ้าไม่ใช่ คืนค่า 0
  • ถ้าเซลล์ปัจจุบันเยี่ยมชมแล้ว คืนค่าจำนวนวิธีที่เซลล์นี้เป็น arr[rows][cols][sc]
  • ถ้าเงื่อนไขข้างต้นไม่ตรง ทำเครื่องหมายเซลล์ปัจจุบันว่าเยี่ยมชมแล้ว ด้วย check[rows][cols][sc] = true
  • คำนวณ temp_1 = matrix_score(matrix, rows-1, cols, sc-matrix[rows][cols])
  • คำนวณ temp_2 = matrix_score(matrix, rows, cols-1, sc-matrix[rows][cols])
  • ตั้งจำนวนวิธีเป็น arr[rows][cols][sc] = temp_1 + temp_2
  • ในที่สุดคืนค่า arr[rows][cols][sc]

ตัวอย่าง

#include <iostream> 
using namespace std; 
#define row 2 
#define col 2 
#define size 30 

int arr[row][col][size]; 
bool check[row][col][size]; 

int matrix_score(int matrix[row][col], int rows, int cols, int ways) { 
    if (ways < 0) { 
        return 0; 
    } 
    if (rows < 0 || cols < 0) { 
        return 0; 
    } 
    if (rows == 0) { 
        if (cols == 0) { 
            if (ways == matrix[0][0]) { 
                return 1; 
            } else { 
                return 0; 
            } 
        } 
    } 
    if (check[rows][cols][ways]) { 
        return arr[rows][cols][ways]; 
    } 
    check[rows][cols][ways] = true; 
    int temp_1 = matrix_score(matrix, rows - 1, cols, ways - matrix[rows][cols]); 
    int temp_2 = matrix_score(matrix, rows, cols - 1, ways - matrix[rows][cols]); 
    arr[rows][cols][ways] = temp_1 + temp_2; 
    return arr[rows][cols][ways]; 
} 

int main() { 
    int matrix[row][col] = { 
        { 1, 1 }, 
        { 1, 1 } 
    }; 
    int ways = 3; 
    cout << "Count of number of ways to reach a given score in a Matrix are: " << matrix_score(matrix, row - 1, col - 1, ways); 
    return 0; 
}

หากเรารันโค้ดข้างต้น จะได้ผลลัพธ์ดังนี้

ผลลัพธ์

Count of number of ways to reach a given score in a Matrix are: 2