矩阵或网格中两个单元格之间的最短距离

给定一个N*M阶的矩阵。查找从源单元格到目标单元格的最短距离,只遍历有限的单元格。而且你只能上下左右移动。如果找到,则输出距离-1。 s代表“来源” d代表“目的地” *表示你可以旅行 0表示您不能旅行 这个问题是针对单一来源和目的地的。 例如:

null
Input : {'0', '*', '0', 's'},        {'*', '0', '*', '*'},        {'0', '*', '*', '*'},        {'d', '*', '*', '*'}Output : 6Input :  {'0', '*', '0', 's'},         {'*', '0', '*', '*'},         {'0', '*', '*', '*'},         {'d', '0', '0', '0'}Output :  -1

我们的想法是 BFS(广度优先搜索) 在基质细胞上。注意,如果图未加权,我们总是可以使用BFS来寻找最短路径。

  1. 将每个单元格存储为一个节点,包括它们的行、列值以及与源单元格的距离。
  2. 用源单元格启动BFS。
  3. 创建一个已访问的数组,其中除“0”单元格外的所有单元格都具有“假”值,因为“0”单元格被分配了“真”值,因为它们无法被遍历。
  4. 在每次移动中不断更新距离源值。
  5. 达到目的地时返回距离,否则返回-1(源和目的地之间不存在路径)。

CPP

// C++ Code implementation for above problem
#include <bits/stdc++.h>
using namespace std;
#define N 4
#define M 4
// QItem for current location and distance
// from source location
class QItem {
public :
int row;
int col;
int dist;
QItem( int x, int y, int w)
: row(x), col(y), dist(w)
{
}
};
int minDistance( char grid[N][M])
{
QItem source(0, 0, 0);
// To keep track of visited QItems. Marking
// blocked cells as visited.
bool visited[N][M];
for ( int i = 0; i < N; i++) {
for ( int j = 0; j < M; j++)
{
if (grid[i][j] == '0' )
visited[i][j] = true ;
else
visited[i][j] = false ;
// Finding source
if (grid[i][j] == 's' )
{
source.row = i;
source.col = j;
}
}
}
// applying BFS on matrix cells starting from source
queue<QItem> q;
q.push(source);
visited[source.row][source.col] = true ;
while (!q.empty()) {
QItem p = q.front();
q.pop();
// Destination found;
if (grid[p.row][p.col] == 'd' )
return p.dist;
// moving up
if (p.row - 1 >= 0 &&
visited[p.row - 1][p.col] == false ) {
q.push(QItem(p.row - 1, p.col, p.dist + 1));
visited[p.row - 1][p.col] = true ;
}
// moving down
if (p.row + 1 < N &&
visited[p.row + 1][p.col] == false ) {
q.push(QItem(p.row + 1, p.col, p.dist + 1));
visited[p.row + 1][p.col] = true ;
}
// moving left
if (p.col - 1 >= 0 &&
visited[p.row][p.col - 1] == false ) {
q.push(QItem(p.row, p.col - 1, p.dist + 1));
visited[p.row][p.col - 1] = true ;
}
// moving right
if (p.col + 1 < M &&
visited[p.row][p.col + 1] == false ) {
q.push(QItem(p.row, p.col + 1, p.dist + 1));
visited[p.row][p.col + 1] = true ;
}
}
return -1;
}
// Driver code
int main()
{
char grid[N][M] = { { '0' , '*' , '0' , 's' },
{ '*' , '0' , '*' , '*' },
{ '0' , '*' , '*' , '*' },
{ 'd' , '*' , '*' , '*' } };
cout << minDistance(grid);
return 0;
}


JAVA

/*package whatever //do not write package name here */
// Java Code implementation for above problem
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
// QItem for current location and distance
// from source location
class QItem {
int row;
int col;
int dist;
public QItem( int row, int col, int dist)
{
this .row = row;
this .col = col;
this .dist = dist;
}
}
public class Maze {
private static int minDistance( char [][] grid)
{
QItem source = new QItem( 0 , 0 , 0 );
// To keep track of visited QItems. Marking
// blocked cells as visited.
firstLoop:
for ( int i = 0 ; i < grid.length; i++) {
for ( int j = 0 ; j < grid[i].length; j++)
{
// Finding source
if (grid[i][j] == 's' ) {
source.row = i;
source.col = j;
break firstLoop;
}
}
}
// applying BFS on matrix cells starting from source
Queue<QItem> queue = new LinkedList<>();
queue.add( new QItem(source.row, source.col, 0 ));
boolean [][] visited
= new boolean [grid.length][grid[ 0 ].length];
visited[source.row][source.col] = true ;
while (queue.isEmpty() == false ) {
QItem p = queue.remove();
// Destination found;
if (grid[p.row][p.col] == 'd' )
return p.dist;
// moving up
if (isValid(p.row - 1 , p.col, grid, visited)) {
queue.add( new QItem(p.row - 1 , p.col,
p.dist + 1 ));
visited[p.row - 1 ][p.col] = true ;
}
// moving down
if (isValid(p.row + 1 , p.col, grid, visited)) {
queue.add( new QItem(p.row + 1 , p.col,
p.dist + 1 ));
visited[p.row + 1 ][p.col] = true ;
}
// moving left
if (isValid(p.row, p.col - 1 , grid, visited)) {
queue.add( new QItem(p.row, p.col - 1 ,
p.dist + 1 ));
visited[p.row][p.col - 1 ] = true ;
}
// moving right
if (isValid(p.row, p.col + 1 , grid,
visited)) {
queue.add( new QItem(p.row, p.col + 1 ,
p.dist + 1 ));
visited[p.row][p.col + 1 ] = true ;
}
}
return - 1 ;
}
// checking where it's valid or not
private static boolean isValid( int x, int y,
char [][] grid,
boolean [][] visited)
{
if (x >= 0 && y >= 0 && x < grid.length
&& y < grid[ 0 ].length && grid[x][y] != '0'
&& visited[x][y] == false ) {
return true ;
}
return false ;
}
// Driver code
public static void main(String[] args)
{
char [][] grid = { { '0' , '*' , '0' , 's' },
{ '*' , '0' , '*' , '*' },
{ '0' , '*' , '*' , '*' },
{ 'd' , '*' , '*' , '*' } };
System.out.println(minDistance(grid));
}
}
// This code is contributed by abhikelge21.


Python3

# Python3 Code implementation for above problem
# QItem for current location and distance
# from source location
class QItem:
def __init__( self , row, col, dist):
self .row = row
self .col = col
self .dist = dist
def __repr__( self ):
return f "QItem({self.row}, {self.col}, {self.dist})"
def minDistance(grid):
source = QItem( 0 , 0 , 0 )
# Finding the source to start from
for row in range ( len (grid)):
for col in range ( len (grid[row])):
if grid[row][col] = = 's' :
source.row = row
source.col = col
break
# To maintain location visit status
visited = [[ False for _ in range ( len (grid[ 0 ]))]
for _ in range ( len (grid))]
# applying BFS on matrix cells starting from source
queue = []
queue.append(source)
visited[source.row][source.col] = True
while len (queue) ! = 0 :
source = queue.pop( 0 )
# Destination found;
if (grid[source.row][source.col] = = 'd' ):
return source.dist
# moving up
if isValid(source.row - 1 , source.col, grid, visited):
queue.append(QItem(source.row - 1 , source.col, source.dist + 1 ))
visited[source.row - 1 ][source.col] = True
# moving down
if isValid(source.row + 1 , source.col, grid, visited):
queue.append(QItem(source.row + 1 , source.col, source.dist + 1 ))
visited[source.row + 1 ][source.col] = True
# moving left
if isValid(source.row, source.col - 1 , grid, visited):
queue.append(QItem(source.row, source.col - 1 , source.dist + 1 ))
visited[source.row][source.col - 1 ] = True
# moving right
if isValid(source.row, source.col + 1 , grid, visited):
queue.append(QItem(source.row, source.col + 1 , source.dist + 1 ))
visited[source.row][source.col + 1 ] = True
return - 1
# checking where move is valid or not
def isValid(x, y, grid, visited):
if ((x > = 0 and y > = 0 ) and
(x < len (grid) and y < len (grid[ 0 ])) and
(grid[x][y] ! = '0' ) and (visited[x][y] = = False )):
return True
return False
# Driver code
if __name__ = = '__main__' :
grid = [[ '0' , '*' , '0' , 's' ],
[ '*' , '0' , '*' , '*' ],
[ '0' , '*' , '*' , '*' ],
[ 'd' , '*' , '*' , '*' ]]
print (minDistance(grid))
# This code is contributed by sajalmittaldei.


Javascript

<script>
// Javascript Code implementation for above problem
var N = 4;
var M = 4;
// QItem for current location and distance
// from source location
class QItem {
constructor(x, y, w)
{
this .row = x;
this .col = y;
this .dist = w;
}
};
function minDistance(grid)
{
var source = new QItem(0, 0, 0);
// To keep track of visited QItems. Marking
// blocked cells as visited.
var visited = Array.from(Array(N), ()=>Array(M).fill(0));
for ( var i = 0; i < N; i++) {
for ( var j = 0; j < M; j++)
{
if (grid[i][j] == '0' )
visited[i][j] = true ;
else
visited[i][j] = false ;
// Finding source
if (grid[i][j] == 's' )
{
source.row = i;
source.col = j;
}
}
}
// applying BFS on matrix cells starting from source
var q = [];
q.push(source);
visited[source.row][source.col] = true ;
while (q.length!=0) {
var p = q[0];
q.shift();
// Destination found;
if (grid[p.row][p.col] == 'd' )
return p.dist;
// moving up
if (p.row - 1 >= 0 &&
visited[p.row - 1][p.col] == false ) {
q.push( new QItem(p.row - 1, p.col, p.dist + 1));
visited[p.row - 1][p.col] = true ;
}
// moving down
if (p.row + 1 < N &&
visited[p.row + 1][p.col] == false ) {
q.push( new QItem(p.row + 1, p.col, p.dist + 1));
visited[p.row + 1][p.col] = true ;
}
// moving left
if (p.col - 1 >= 0 &&
visited[p.row][p.col - 1] == false ) {
q.push( new QItem(p.row, p.col - 1, p.dist + 1));
visited[p.row][p.col - 1] = true ;
}
// moving right
if (p.col + 1 < M &&
visited[p.row][p.col + 1] == false ) {
q.push( new QItem(p.row, p.col + 1, p.dist + 1));
visited[p.row][p.col + 1] = true ;
}
}
return -1;
}
// Driver code
var grid = [ [ '0' , '*' , '0' , 's' ],
[ '*' , '0' , '*' , '*' ],
[ '0' , '*' , '*' , '*' ],
[ 'd' , '*' , '*' , '*' ] ];
document.write(minDistance(grid));
// This code is contributed by rrrtnx.
</script>


输出

6

输出:

6

本文由 普拉尚特·辛格 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享