In: Computer Science
C++ CODE ONLY
Using the following code.
#include <iostream>
#include <string>
#include <climits>
#include <algorithm>
using namespace std;
// M x N matrix
#define M 5
#define N 5
// Naive recursive function to find the minimum cost to
reach
// cell (m, n) from cell (0, 0)
int findMinCost(int cost[M][N], int m, int n)
{
// base case
if (n == 0 || m == 0)
return INT_MAX;
// if we're at first cell (0, 0)
if (m == 1 && n == 1)
return cost[0][0];
// include cost of the current cell in path and
recur to find minimum
// of the path from adjacent left cell and adjacent
top cell.
return min (findMinCost(cost, m - 1, n),
findMinCost(cost, m, n - 1))
+ cost[m - 1][n - 1];
}
int main()
{
int cost[M][N] =
{
{ 4, 7, 8, 6, 4 },
{ 6, 7, 3, 9, 2 },
{ 3, 8, 1, 2, 4 },
{ 7, 1, 7, 3, 7 },
{ 2, 9, 8, 9, 3 }
};
cout << "The minimum cost is " << findMinCost(cost, M, N);
return 0;
}
Answer the following questions:
Given a M x N matrix where each cell has a cost associated with it, find the minimum cost to reach last cell (0,0) of the matrix from its first cell (M,N). We can only move one unit right or one unit down from any cell. i.e. from cell (I,j), we can move to (i, j-1) or (i-1,j).
Example output:
Minimum cost is 34.
#include <bits/stdc++.h>
using namespace std;
#define ROW 5
#define COL 5
struct cell
{
int x,
y;
int
distance;
cell(int
x, int y, int
distance) :
x(x),
y(y), distance(distance) {}
};
bool operator<(const
cell& a, const cell&
b)
{
if
(a.distance == b.distance)
{
if
(a.x != b.x)
return
(a.x < b.x);
else
return
(a.y < b.y);
}
return
(a.distance < b.distance);
bool isInsideGrid(int
i, int j)
{
return
(i >= 0 && i < COL && j >= 0
&& j < ROW);
}
int shortest(int
grid[ROW][COL], int row,
int col)
{
int
dis[row][col];
for
(int i = 0; i < row;
i++)
for
(int j = 0; j < col;
j++)
dis[i][j]
= INT_MAX;
int
dx[] = {-1, 0, 1, 0};
int dy[]
= {0, 1, 0, -1};
set<cell>
st;
st.insert(cell(0, 0,
0));
dis[0][0] =
grid[0][0];
while
(!st.empty())
{
cell
k = *st.begin();
st.erase(st.begin());
for
(int i = 0; i < 4;
i++)
{
int
x = k.x + dx[i];
int
y = k.y + dy[i];
if
(!isInsideGrid(x, y))
continue;
if
(dis[x][y] > dis[k.x][k.y] + grid[x][y])
{
if
(dis[x][y] != INT_MAX)
st.erase(st.find(cell(x,
y, dis[x][y])));
dis[x][y]
= dis[k.x][k.y] + grid[x][y];
st.insert(cell(x,
y, dis[x][y]));
}
}
}
for (int i = 0; i
< row; i++, cout << endl)
for
(int j = 0; j < col; j++)
cout
<< dis[i][j] << " ";
return
dis[row - 1][col - 1];
}
int main()
{
int
grid[ROW][COL] =
{
31,
100, 65, 12, 18,
10,
13, 47, 157, 6,
100,
113, 174, 11, 33,
88,
124, 41, 20, 140,
99,
32, 111, 41, 20
};
cout <<
shortest(grid, ROW, COL) << endl;
return
0;
}