ধারণা
সংখ্যার একটি প্রদত্ত গ্রিডের সাপেক্ষে, সর্বাধিক দৈর্ঘ্যের স্নেক সিকোয়েন্স নির্ধারণ করুন এবং এটি প্রদর্শন করুন৷ এটি লক্ষ্য করা গেছে যে যদি সর্বাধিক দৈর্ঘ্য সহ একাধিক স্নেক সিকোয়েন্স বিদ্যমান থাকে তবে তাদের যে কোনও একটি প্রদর্শন করুন৷
প্রকৃতপক্ষে, একটি স্নেক সিকোয়েন্স গ্রিডের সংলগ্ন সংখ্যাগুলি দিয়ে তৈরি যাতে প্রতিটি সংখ্যার জন্য ডানদিকে তারপর নম্বর বা তার নীচের সংখ্যাটি হয় +1 বা -1 এর মান। এখানে, উদাহরণস্বরূপ, যদি আমরা গ্রিডে অবস্থান (a, b) রাখি, তাহলে আমরা হয় ডানদিকে যেতে পারি যেমন (a, b+1) যদি সেই সংখ্যাটি ± 1 হয় বা সরানো হয় অর্থাৎ (a+1, b) সংখ্যাটি হলে হল ± 1।
উদাহরণস্বরূপ,
10, 7, 6, 3 9, 8, 7, 6 8, 4, 2, 7 2, 2, 2, 8
উপরের গ্রিডে, সর্বাধিক সাপের ক্রম হল:(10, 9, 8, 7, 6, 7, 8)
নীচের চিত্রটি সম্ভাব্য সমস্ত পথ দেখায় -
10 7 →6 3 ↓ ↓ ↓ 9 → 8 → 7→ 6 ↓↓ 8 4 2 7 ↓ 2 2 2 8
পদ্ধতি
এখানে, ধারণাটি ডায়নামিক প্রোগ্রামিং বাস্তবায়ন করা। ম্যাট্রিক্সের প্রতিটি কোষের সম্মানের সাথে, আমরা একটি সাপের দীর্ঘতম দৈর্ঘ্য রাখি যা বর্তমান কোষে শেষ হয়। এখন দীর্ঘতম দৈর্ঘ্যের সাপের ক্রমটির সর্বোচ্চ মান থাকবে। এখানে, দীর্ঘতম মান কোষটি সাপের লেজের সাথে মিলিত হবে। সাপ প্রিন্ট করার জন্য, আমাদের লেজ থেকে সাপের মাথা পর্যন্ত ফিরে যেতে হবে। অনুমান করুন T[a][b] একটি সাপের সর্বাধিক দৈর্ঘ্যের প্রতিনিধিত্ব করে যা কোষে (a, b) শেষ হয়, তারপর প্রদত্ত ম্যাট্রিক্স M-এর জন্য, ডায়নামিক প্রোগ্রামিং সম্পর্কটিকে −
হিসাবে সংজ্ঞায়িত করা হয়।T[0][0] = 0 T[a][b] = max(T[a][b], T[a][b – 1] + 1) if M[a][b] = M[a][b – 1] ± 1 T[a][b] = max(T[a][b], T[a – 1][b] + 1) if M[a][b] = M[a – 1][b] ± 1
উদাহরণ
// C++ program to find maximum length // Snake sequence and print it #include <bits/stdc++.h> using namespace std; #define M 4 #define N 4 struct Point{ int X, Y; }; // Shows function to find maximum length Snake sequence path // (a, b) corresponds to tail of the snake list<Point> findPath(int grid1[M][N], int mat1[M][N], int a, int b){ list<Point> path1; Point pt1 = {a, b}; path1.push_front(pt1); while (grid1[a][b] != 0){ if (a > 0 && grid1[a][b] - 1 == grid1[a - 1][b]){ pt1 = {a - 1, b}; path1.push_front(pt1); a--; } else if (b > 0 && grid1[a][b] - 1 == grid1[a][b - 1]){ pt1 = {a, b - 1}; path1.push_front(pt1); b--; } } return path1; } // Shows function to find maximum length Snake sequence void findSnakeSequence(int mat1[M][N]){ // Shows table to store results of subproblems int lookup1[M][N]; // Used to initialize by 0 memset(lookup1, 0, sizeof lookup1); // Used to store maximum length of Snake sequence int max_len1 = 0; // Used to store cordinates to snake's tail int max_row1 = 0; int max_col1 = 0; // Used to fill the table in bottom-up fashion for (int a = 0; a < M; a++){ for (int b = 0; b < N; b++){ // Perform except for (0, 0) cell if (a || b){ // look above if (a > 0 && abs(mat1[a - 1][b] - mat1[a][b]) == 1){ lookup1[a][b] = max(lookup1[a][b], lookup1[a - 1][b] + 1); if (max_len1 < lookup1[a][b]){ max_len1 = lookup1[a][b]; max_row1 = a, max_col1 = b; } } // look left if (b > 0 && abs(mat1[a][b - 1] - mat1[a][b]) == 1){ lookup1[a][b] = max(lookup1[a][b], lookup1[a][b - 1] + 1); if (max_len1 < lookup1[a][b]){ max_len1 = lookup1[a][b]; max_row1 = a, max_col1 = b; } } } } } cout << "Maximum length of Snake sequence is: " << max_len1 << endl; // Determine maximum length Snake sequence path list<Point> path1 = findPath(lookup1, mat1, max_row1, max_col1); cout << "Snake sequence is:"; for (auto it = path1.begin(); it != path1.end(); it++) cout << endl << mat1[it->X][it->Y] << " ("<< it->X << ", " << it->Y << ")" ;} // Driver code int main(){ int mat1[M][N] ={{10, 7, 6, 3},{9, 8, 7, 6},{8, 4, 2, 7},{2, 2, 2, 8},}; findSnakeSequence(mat1); return 0; }
আউটপুট
Maximum length of Snake sequence is: 6 Snake sequence is: 10 (0, 0) 9 (1, 0) 8 (1, 1) 7 (1, 2) 6 (1, 3) 7 (2, 3) 8 (3, 3)