logo

Poiščite največjo dolžino kačje zaporedje

Glede na mrežo številk poiščite največjo dolžino kačje zaporedje in ga natisnite. Če obstaja več zaporedja kače z največjo dolžino natisnite katero od njih.

Zaporedje kač je sestavljeno iz sosednjih številk v mreži, tako da je za vsako številko na desni ali številka spodaj vrednost +1 ali -1 njegova vrednost. Na primer, če ste na lokaciji (x y) v omrežju, se lahko premikate desno, tj. (X y+1), če je ta številka ± 1 ali se premaknete navzdol, tj. (X+1 y), če je ta številka ± 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)

Spodaj prikazuje vse možne poti:

pyspark

Snakessequence' title=

Toplo vam priporočamo, da svoj brskalnik zmanjšate in to najprej preizkusite sami.



Ideja je uporaba dinamičnega programiranja. Za vsako celico matrice ohranimo največjo dolžino kače, ki se konča v trenutni celici. Zaporedje kače največje dolžine bo imelo največjo vrednost. Celica največje vrednosti bo ustrezala repu kače. Da bi kačo natisnili, se moramo vrniti z repa vse do kačje glave.

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

Spodaj je izvedba ideje 

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(' ')) 

Izhod
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)

Časovna kompleksnost zgornje raztopine je O (M*N). Pomožni prostor, ki ga uporablja zgornja rešitev, je O (M*N). Če nam ni treba tiskati kačjega prostora, je mogoče še zmanjšati na O (n), saj rezultat uporablja samo iz zadnje vrstice.