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

ค้นหาความยาวของเส้นทางต่อเนื่องกันที่ยาวที่สุดจากอักขระเริ่มต้นที่กำหนดใน C++


กำหนดเมทริกซ์ของอักขระต่างๆ เริ่มจากตัวละครตัวหนึ่ง เราต้องหาเส้นทางที่ยาวที่สุดโดยสำรวจตัวละครทั้งหมดที่มากกว่าตัวละครปัจจุบัน ตัวละครเรียงต่อกัน

ค้นหาความยาวของเส้นทางต่อเนื่องกันที่ยาวที่สุดจากอักขระเริ่มต้นที่กำหนดใน C++

เริ่มจาก E.

ในการค้นหาเส้นทางที่ยาวที่สุด เราจะใช้อัลกอริธึม Depth First Search ระหว่าง DFS ปัญหาย่อยบางอย่างอาจเกิดขึ้นหลายครั้ง เพื่อหลีกเลี่ยงการคำนวณปัญหาย่อยนั้นครั้งแล้วครั้งเล่า เราจะใช้วิธีการเขียนโปรแกรมแบบไดนามิก

ตัวอย่าง

#include<iostream>
#define ROW 3
#define COL 3
using namespace std;
// tool matrices to recur for adjacent cells.
int x[] = {0, 1, 1, -1, 1, 0, -1, -1};
int y[] = {1, 0, 1, 1, -1, -1, 0, -1};
int longestPath[ROW][COL];
char mat[ROW][COL] = {
   {'a','c','d'},
   {'h','b','a'},
   {'i','g','f'}
};
int max(int a, int b){
   return (a>b)?a:b;
}
bool isvalid(int i, int j){
   if (i < 0 || j < 0 || i >= ROW || j >= COL) //when i and j are in range
   return false;
   return true;
}
bool isadjacent(char previous, char current){
   return ((current - previous) == 1); //check current and previous are adjacent or not
}
int findLongestLen(int i, int j, char prev){
   if (!isvalid(i, j) || !isadjacent(prev, mat[i][j]))
      //when already included or not adjacent
      return 0;
   if (longestPath[i][j] != -1)
   return longestPath[i][j]; //subproblems are solved already
   int len = 0; // Initialize result to 0
   for (int k=0; k<8; k++) //find length of the largest path recursively
   len = max(len, 1 + findLongestLen(i + x[k], j + y[k], mat[i][j]));
      return longestPath[i][j] = len; // save the length and return
}
int getLen(char start){
   for(int i = 0; i<ROW; i++)
   for(int j = 0; j<COL; j++)
   longestPath[i][j] = -1; //set all elements to -1
   int len = 0;
   for (int i=0; i<ROW; i++){
      for (int j=0; j<COL; j++){ // check for all possible starting point
         if (mat[i][j] == start) {
            for (int k=0; k<8; k++) //for all eight adjacent cells
               len = max(len, 1 + findLongestLen(i + x[k], j + y[k], start));
            }
         }
   }
   return len;
}
int main() {
   char start;
   cout << "Enter Starting Point (a-i): "; cin >> start;
   cout << "Maximum consecutive path: " << getLen(start);
   return 0;
}

ผลลัพธ์

Enter Starting Point (a-i): e
Maximum consecutive path: 5