Като се има предвид мрежа от числа, намира максимална дължина на змийската последователност и я отпечатайте. Ако съществуват множество последователности на змия с максимална дължина отпечатайте някой от тях.
Последователността на змията е съставена от съседни числа в мрежата, така че за всяко число числото вдясно или числото под него е +1 или -1 стойността му. Например, ако сте на място (x y) в мрежата, можете или да се движите вдясно, т.е. (x y+1), ако това число е ± 1 или се премествате надолу, т.е. (x+1 y), ако това число е ± 1.
For example 9 6 5 2 8 7 6 5 7 3 1 6 1 1 1 7 In above grid the longest snake sequence is: (9 8 7 6 5 6 7)
По -долу Фигура показва всички възможни пътища:
java подниз съдържа
Горещо ви препоръчваме да сведете до минимум браузъра си и да опитате първо това сами.
'число на Ойлер в Java'
Идеята е да се използва динамично програмиране. За всяка клетка на матрицата запазваме максимална дължина на змия, която завършва в текущата клетка. Последователността на змията с максимална дължина ще има максимална стойност. Клетката с максимална стойност ще съответства на опашката на змията. За да отпечатаме змията, трябва да отстъпим от опашката чак обратно към главата на Змия.
Let T[i][i] represent maximum length of a snake which ends at cell (i j) then for given matrix M the DP relation is defined as T[0][0] = 0 T[i][j] = max(T[i][j] T[i][j - 1] + 1) if M[i][j] = M[i][j - 1] ± 1 T[i][j] = max(T[i][j] T[i - 1][j] + 1) if M[i][j] = M[i - 1][j] ± 1
По -долу е прилагането на идеята
C++// C++ program to find maximum length // Snake sequence and print it #include using namespace std; #define M 4 #define N 4 struct Point { int x y; }; // Function to find maximum length Snake sequence path // (i j) corresponds to tail of the snake list<Point> findPath(int grid[M][N] int mat[M][N] int i int j) { list<Point> path; Point pt = {i j}; path.push_front(pt); while (grid[i][j] != 0) { if (i > 0 && grid[i][j] - 1 == grid[i - 1][j]) { pt = {i - 1 j}; path.push_front(pt); i--; } else if (j > 0 && grid[i][j] - 1 == grid[i][j - 1]) { pt = {i j - 1}; path.push_front(pt); j--; } } return path; } // Function to find maximum length Snake sequence void findSnakeSequence(int mat[M][N]) { // table to store results of subproblems int lookup[M][N]; // initialize by 0 memset(lookup 0 sizeof lookup); // stores maximum length of Snake sequence int max_len = 0; // store coordinates to snake's tail int max_row = 0; int max_col = 0; // fill the table in bottom-up fashion for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { // do except for (0 0) cell if (i || j) { // look above if (i > 0 && abs(mat[i - 1][j] - mat[i][j]) == 1) { lookup[i][j] = max(lookup[i][j] lookup[i - 1][j] + 1); if (max_len < lookup[i][j]) { max_len = lookup[i][j]; max_row = i max_col = j; } } // look left if (j > 0 && abs(mat[i][j - 1] - mat[i][j]) == 1) { lookup[i][j] = max(lookup[i][j] lookup[i][j - 1] + 1); if (max_len < lookup[i][j]) { max_len = lookup[i][j]; max_row = i max_col = j; } } } } } cout << 'Maximum length of Snake sequence is: ' << max_len << endl; // find maximum length Snake sequence path list<Point> path = findPath(lookup mat max_row max_col); cout << 'Snake sequence is:'; for (auto it = path.begin(); it != path.end(); it++) cout << endl << mat[it->x][it->y] << ' (' << it->x << ' ' << it->y << ')' ; } // Driver code int main() { int mat[M][N] = { {9 6 5 2} {8 7 6 5} {7 3 1 6} {1 1 1 7} }; findSnakeSequence(mat); return 0; }
Java // Java program to find maximum length // Snake sequence and print it import java.util.*; class GFG { static int M = 4; static int N = 4; static class Point { int x y; public Point(int x int y) { this.x = x; this.y = y; } }; // Function to find maximum length Snake sequence path // (i j) corresponds to tail of the snake static List<Point> findPath(int grid[][] int mat[][] int i int j) { List<Point> path = new LinkedList<>(); Point pt = new Point(i j); path.add(0 pt); while (grid[i][j] != 0) { if (i > 0 && grid[i][j] - 1 == grid[i - 1][j]) { pt = new Point(i - 1 j); path.add(0 pt); i--; } else if (j > 0 && grid[i][j] - 1 == grid[i][j - 1]) { pt = new Point(i j - 1); path.add(0 pt); j--; } } return path; } // Function to find maximum length Snake sequence static void findSnakeSequence(int mat[][]) { // table to store results of subproblems int [][]lookup = new int[M][N]; // initialize by 0 // stores maximum length of Snake sequence int max_len = 0; // store coordinates to snake's tail int max_row = 0; int max_col = 0; // fill the table in bottom-up fashion for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { // do except for (0 0) cell if (i != 0 || j != 0) { // look above if (i > 0 && Math.abs(mat[i - 1][j] - mat[i][j]) == 1) { lookup[i][j] = Math.max(lookup[i][j] lookup[i - 1][j] + 1); if (max_len < lookup[i][j]) { max_len = lookup[i][j]; max_row = i; max_col = j; } } // look left if (j > 0 && Math.abs(mat[i][j - 1] - mat[i][j]) == 1) { lookup[i][j] = Math.max(lookup[i][j] lookup[i][j - 1] + 1); if (max_len < lookup[i][j]) { max_len = lookup[i][j]; max_row = i; max_col = j; } } } } } System.out.print('Maximum length of Snake ' + 'sequence is: ' + max_len + 'n'); // find maximum length Snake sequence path List<Point> path = findPath(lookup mat max_row max_col); System.out.print('Snake sequence is:'); for (Point it : path) System.out.print('n' + mat[it.x][it.y] + ' (' + it.x + ' ' + it.y + ')'); } // Driver code public static void main(String[] args) { int mat[][] = {{9 6 5 2} {8 7 6 5} {7 3 1 6} {1 1 1 7}}; findSnakeSequence(mat); } } // This code is contributed by 29AjayKumar
C# // C# program to find maximum length // Snake sequence and print it using System; using System.Collections.Generic; class GFG { static int M = 4; static int N = 4; public class Point { public int x y; public Point(int x int y) { this.x = x; this.y = y; } }; // Function to find maximum length Snake sequence path // (i j) corresponds to tail of the snake static List<Point> findPath(int[ ] grid int[ ] mat int i int j) { List<Point> path = new List<Point>(); Point pt = new Point(i j); path.Insert(0 pt); while (grid[i j] != 0) { if (i > 0 && grid[i j] - 1 == grid[i - 1 j]) { pt = new Point(i - 1 j); path.Insert(0 pt); i--; } else if (j > 0 && grid[i j] - 1 == grid[i j - 1]) { pt = new Point(i j - 1); path.Insert(0 pt); j--; } } return path; } // Function to find maximum length Snake sequence static void findSnakeSequence(int[ ] mat) { // table to store results of subproblems int[ ] lookup = new int[M N]; // initialize by 0 // stores maximum length of Snake sequence int max_len = 0; // store coordinates to snake's tail int max_row = 0; int max_col = 0; // fill the table in bottom-up fashion for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { // do except for (0 0) cell if (i != 0 || j != 0) { // look above if (i > 0 && Math.Abs(mat[i - 1 j] - mat[i j]) == 1) { lookup[i j] = Math.Max( lookup[i j] lookup[i - 1 j] + 1); if (max_len < lookup[i j]) { max_len = lookup[i j]; max_row = i; max_col = j; } } // look left if (j > 0 && Math.Abs(mat[i j - 1] - mat[i j]) == 1) { lookup[i j] = Math.Max( lookup[i j] lookup[i j - 1] + 1); if (max_len < lookup[i j]) { max_len = lookup[i j]; max_row = i; max_col = j; } } } } } Console.Write('Maximum length of Snake ' + 'sequence is: ' + max_len + 'n'); // find maximum length Snake sequence path List<Point> path = findPath(lookup mat max_row max_col); Console.Write('Snake sequence is:'); foreach(Point it in path) Console.Write('n' + mat[it.x it.y] + ' (' + it.x + ' ' + it.y + ')'); } // Driver code public static void Main(String[] args) { int[ ] mat = { { 9 6 5 2 } { 8 7 6 5 } { 7 3 1 6 } { 1 1 1 7 } }; findSnakeSequence(mat); } } // This code is contributed by Princi Singh
Python3 def snakesequence(S m n): sequence = {} DP = [[1 for x in range(m+1)] for x in range(n+1)] a b maximum = 0 0 0 position = [0 0] for i in range(0 n+1): for j in range(0 m+1): a b = 0 0 p = 'initial' if(i > 0 and abs(S[i][j] - S[i-1][j]) == 1): a = DP[i-1][j] if(j > 0 and abs(S[i][j] - S[i][j-1]) == 1): b = DP[i][j-1] if a != 0 and a >= b: p = str(i-1) + ' ' + str(j) elif b != 0: p = str(i) + ' ' + str(j-1) q = str(i) + ' ' + str(j) sequence[q] = p DP[i][j] = DP[i][j] + max(a b) if DP[i][j] >= maximum: maximum = DP[i][j] position[0] = i position[1] = j snakeValues = [] snakePositions = [] snakeValues.append(S[position[0]][position[1]]) check = 'found' str_next = str(position[0]) + ' ' + str(position[1]) findingIndices = sequence[str_next].split() while(check == 'found'): if sequence[str_next] == 'initial': snakePositions.insert(0 str_next) check = 'end' continue findingIndices = sequence[str_next].split() g = int(findingIndices[0]) h = int(findingIndices[1]) snakeValues.insert(0 S[g][h]) snake_position = str(g) + ' ' + str(h) snakePositions.insert(0 str_next) str_next = sequence[str_next] return [snakeValues snakePositions] S = [[9 6 5 2] [8 7 6 5] [7 3 1 6] [1 1 10 7]] m = 3 n = 3 seq = snakesequence(S m n) for i in range(len(seq[0])): print(seq[0][i] '' seq[1][i].split())
JavaScript function snakesequence(S m n) { let sequence = {} let DP = new Array(n + 1) for (var i = 0; i <= n; i++) DP[i] = new Array(m + 1).fill(1) let a = 0 b = 0 maximum = 0 let position = [0 0] for (var i = 0; i <= n; i++) { for (var j = 0; j <= m; j++) { a = 0 b = 0 let p = 'initial' if(i > 0 && Math.abs(S[i][j] - S[i-1][j]) == 1) a = DP[i-1][j] if(j > 0 && Math.abs(S[i][j] - S[i][j-1]) == 1) b = DP[i][j-1] if (a != 0 && a >= b) p = String(i-1) + ' ' + String(j) else if (b != 0) p = String(i) + ' ' + String(j-1) let q = String(i) + ' ' + String(j) sequence[q] = p DP[i][j] = DP[i][j] + Math.max(a b) if (DP[i][j] >= maximum) { maximum = DP[i][j] position[0] = i position[1] = j } } } let snakeValues = [] let snakePositions = [] snakeValues.push(S[position[0]][position[1]]) let check = 'found' let String_next = String(position[0]) + ' ' + String(position[1]) let findingIndices = sequence[String_next].split(' ') while(check == 'found') { if (sequence[String_next] == 'initial') { snakePositions.unshift(String_next) check = 'end' continue } findingIndices = sequence[String_next].split(' ') let g = parseInt(findingIndices[0]) let h = parseInt(findingIndices[1]) snakeValues.unshift(S[g][h]) let snake_position = String(g) + ' ' + String(h) snakePositions.unshift(String_next) String_next = sequence[String_next] } return [snakeValues snakePositions] } // Driver Code let S = [[9 6 5 2] [8 7 6 5] [7 3 1 6] [1 1 10 7]] let m = 3 let n = 3 let seq = snakesequence(S m n) for (var i = 0; i < seq[0].length; i++) console.log(seq[0][i] + '' seq[1][i].split(' '))
Изход
Maximum length of Snake sequence is: 6 Snake sequence is: 9 (0 0) 8 (1 0) 7 (1 1) 6 (1 2) 5 (1 3) 6 (2 3) 7 (3 3)
Сложността на времето на горния разтвор е o (m*n). Спомагателното пространство, използвано от горепосоченото решение, е O (M*n). Ако не се изисква да отпечатваме змийското пространство, може да бъде допълнително намалено до O (n), тъй като използваме резултата само от последния ред.
kmp алгоритъм