Member 12953478 Ответов: 5

Как мне пройти через этот вопрос интервью по программированию


учитывая 2-D матрицу, где 1 представляет места, где лягушка может прыгать, а 0 - пустые пространства, лягушка может свободно двигаться в горизонтальном направлении (только на 1) без каких-либо затрат (прыжок).Вертикальный скачок из заданной точки матрицы в другую точку матрицы может быть взят (только на 1) со стоимостью как количеством сделанных прыжков. Учитывая источник и пункт назначения, лягушка должна достичь пункта назначения, минимизируя затраты (прыжок).

Что я уже пробовал:

Я попытался начать с первой ячейки и проверить, есть ли в строке какая-либо соседняя 1. Если там, то двигайтесь к нему, иначе двигайтесь вниз. Однако, похоже, вопрос требует несколько иного подхода

Suvendu Shekhar Giri

Поделитесь, что вы уже пробовали?

Maciej Los

Эта проблема хорошо известна как Проблема кратчайшего пути - Википедия[^]. Чтобы решить эту проблему, вы можете использовать Алгоритм Дейкстры - Википедия[^]

5 Ответов

Рейтинг:
2

Patrice T

Как программист, ваша задача-создавать алгоритмы то, что решают конкретные задачи, это способность, которую они хотят проверить.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.

Это поможет освоить некоторые методы анализа, Метод Дейкстры сверху вниз это хорошее начало.
https://en.wikipedia.org/wiki/Top-down_and_bottom-up_design[^]
https://en.wikipedia.org/wiki/Structured_programming[^]
https://en.wikipedia.org/wiki/Edsger_W._Dijkstra[^]
https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD316.PDF[^]


Рейтинг:
2

CPallini

Это алгоритм оптимизации, если вам нужна отправная точка, то посмотрите на эту страницу Википедии: Математическая оптимизация-Википедия[^].


Рейтинг:
2

Peter Leow

Вы можете прочитать об обучении подкреплению, которое является областью машинного обучения. Смотрите одно из моих демо-видео на Q-обучение[^] что является своего рода подкрепляющим обучением. Google для некоторых статей на эту тему.


Рейтинг:
1

KarstenK

Сначала вам нужен алгоритм, чтобы найти все полезные пути и сохранить их. Простой подход заключается в использовании алгоритма, который минимизирует вектор расстояния до нуля.

В зависимости от стен или препятствий это может быть не самый короткий путь, но вокруг них. Так что точки вблизи препятствий могут быть этапами к цели.

После этого вы оцениваете стоимость каждого пути, чтобы найти оптимальный путь (с минимальными затратами).


Сделайте несколько рисунков, чтобы визуализировать проблему.


Рейтинг:
0

Member 11274452

// надеюсь, это может помочь

import java.util.Scanner;

public class frogjump {
	static int u,o;
	static int min(int x, int y, int m, int n, int a[][],frogjumpdp tc[]){
		
		tc[(m*4)+n].vis = 1;
		if(m<0 || n<0 || m>3 || n>3 || a[m][n] == 0){
		return 100;
		}

		else if(m==x && n==y){
		return 0;
		}
		
		else{	
				int q,w,e,r;

				if(m-1>=0 && n>=0 && m-1<4 && n<4){
					if( a[m-1][n] == 1  && tc[((m-1)*4)+n].val == -1 && tc[((m-1)*4)+n].vis == 0){
						tc[((m-1)*4)+n].vis = 1;
						q = min(x,y,m-1,n,a,tc);
						tc[((m-1)*4)+n].val = q;
					}
					else{
						if(tc[((m-1)*4)+n].val != -1){
							q = tc[((m-1)*4)+n].val;
						}
						else{
							q = 100;
						}
					}
				}
				else{
					q = 100;
				}
				
				
				if(m+1>=0 && n>=0 && m+1<4 && n<4 ){
					if( a[m+1][n] == 1  && tc[((m+1)*4)+n].val == -1 && tc[((m+1)*4)+n].vis == 0){
						tc[((m+1)*4)+n].vis = 1;
						w = min(x,y,m+1,n,a,tc);
						tc[((m+1)*4)+n].val = w;
					}
					else{
						if(tc[((m+1)*4)+n].val != -1){
							w = tc[((m+1)*4)+n].val;
						}
						else{
							w = 100;
						}
					}
				}
				else{
					w = 100;
				}
				
				
				if(m>=0 && n-1>=0 && m<4 && n-1<4 ){
					if( a[m][n-1] == 1 && tc[(m*4)+n-1].val == -1 && tc[(m*4)+n-1].vis == 0){
						tc[(m*4)+n-1].vis = 1;
						e = min(x,y,m,n-1,a,tc);
						tc[(m*4)+n-1].val = e;
					}
					else{
						if(tc[(m*4)+n-1].val != -1){
							e = tc[(m*4)+n-1].val;
						}
						else{
							e = 100;
						}
					}
				}
				else{
						e = 100;
				}
				
				
				if(m>=0 && n+1>=0 && m<4 && n+1<4){
					if( a[m][n+1] == 1 && tc[(m*4)+n+1].val == -1 && tc[(m*4)+n+1].vis == 0){
						tc[(m*4)+n+1].vis = 1;
						r = min(x,y,m,n+1,a,tc);
						tc[(m*4)+n+1].val = r;
					}
					else{
						if(tc[(m*4)+n+1].val != -1){
							r = tc[(m*4)+n+1].val;
						}
						else{
							r = 100;
						}
					}	
				}
				else{
					r = 100;
				}
				

				int t = mini(mini(q,w),mini(e,r));
				
				if( t == q || t == w){
						t++;
				}
				return t; 
		}
	}


	static int mini(int x,int y)
	{
		return((x<y)?x:y);
	}
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);   
		
		System.out.println("Please enter rows of the array: ");
		u = scan.nextInt();
		 
		System.out.println("Please enter columns of the array: ");
		o = scan.nextInt();
		
		int cost[][] = new int[u][o] ;
		
		for(int i=0 ; i<u ; i++){
			for(int j=0 ; j<o ; j++){
				System.out.println("Please enter element array[" + i + "][" + j + "]:");
				cost[i][j] = scan.nextInt();
			}
		}
		
		System.out.println("Please enter x cord of start pos: ");
		int x = scan.nextInt();
		System.out.println("Please enter y cord of start pos: ");
		int y = scan.nextInt();
		System.out.println("Please enter x cord of dest pos: ");
		int m = scan.nextInt();
		System.out.println("Please enter y cord of dest pos: ");
		int n = scan.nextInt();
		/*int cost[][]= {  {1, 1, 1, 0},
			         	   {1, 1, 1, 1},
			         	   {1, 0, 1, 1},
			         	   {1, 1, 1, 0}  };*/
		
		frogjumpdp[] tc = new frogjumpdp[u*o];
		
		for ( int i=0; i<u*o; i++) {
			tc[i]=new frogjumpdp();
			}
		int t = min(x,y,m,n,cost,tc);
		if(t != 10000){
			System.out.println("minimum cost to reach (" + m +"," + n + ") from (" + x +"," + y +") is :" + t);
		}
		else{
			System.out.println("minimum cost to reach (" + m +"," + n + ") from (" + x +"," + y +") is not reachable");
		}
	}

}

class frogjumpdp {
	public int val,vis;
	
	frogjumpdp(){
		val = -1;
		vis = 0;
	}

}


[no name]

Это действительно хороший код C++, который у вас есть.

Member 13656102

tc [(m*4)+n]. vis = 1;
если (m< 0 | / n< 0 | / m> 3 | / n> 3 / / a[m][n] == 0){
возврат 100;
почему вы рассматривали 4 & 3 здесь?? это только для матрицы 4*4?? @Graeme_Grant