In: Computer Science
You are required to solve the problem on Terrain Navigation.
Terrain navigation is a key component in the design of unmanned aerial vehicles (UAVs). Vehichles such as a robot or a car, can travel on land; and vehiches such as a drone or a plane can fly above the land. A UAV system contains an on board computer that has stored the terrain information for the area in which it is to be operated, Because it knows where it is at all times (often using a global positioning system (GPS) receiver), the vehicle can then select the best path to get to a designed spot. If the destination changes, the vehicle can refer to its internal maps and recompute the new path. The computer software that guides these vechicles must be tested over a variety of land formations and topologies. Elevvation information for large grids of land is available in computer databases. One way of measuring the "difficulty" of a lanad grid with respect to terrain navigation is to determine the number of peaks in the grid, where a peak is a point that has lower elevations all around it. For this problem, we want to determine whether the value in grid position [m] [n] is peak. Assume that the values in the four positions shown are adjacent to grid position [m] [n]:
grid [m-1] [n] | ||
---|---|---|
grid [m][n-1] | grid [m][n] | grid [m][n+1] |
grid [m+1] [n] |
Write a program that reads elevation data from a data file named grid1. txt. (this file you have to create and name it as grid 1.txt.) data as shown below which represent elevation for a grid that has 6 points along the side and seven points along the top ( the peaks have been highlighted and underlined):
5039 5127 5238 5259 5248 5310 5299
5150 5392 5410 5401 5352 5820 5321
5290 5560 5490 5421 5530 5831 5210
5110 5429 5430 5411 5459 5630 5319
4920 5129 4921 5821 4722 4921 5129
5023 5129 4822 4872 4794 4862 4245
Then prints the number of peaks and their locations. Assume that the first line of the data file contains the number of rows and the number of columns for the grid of information. These values are then followed by the elevation values, in row order. The maximum size of the grid is 25 rows by 25 columns.
Hints:
Answer is written with minor modifications so that you can grasp the concept well, All three programs are completely same with one two line change only
#Program for taking input from user directly (not through file) and without count
#include <stdio.h>
int main(void) {
int m,n; // Two variables to hold (m - for no. of rows, n -
for no. of columns)
scanf("%d %d", &m,&n);
int arr[m][n]; // (An array of size m*n to
store elevation data)
for(int i=0;i<m;i++) // Taking the input of
elevation data in next 5 lines
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
// See explanation below for i =1 and i<m-1 and same for
j
for(int i=1;i<m-1;i++) //
Checking with neighbors to get the peak
for(int j=1;j<n-1;j++)
{
if(arr[i][j]>arr[i-1][j]
&& arr[i][j]>arr[i][j-1] &&
arr[i][j]>arr[i+1][j] && arr[i][j]>arr[i][j+1]) //
main logic
{
printf("%d %d",
i, j);
printf("\n");
}
}
return 0;
}
Explanation for i =1 and i<m-1 and same for j: Since we don't have to check at corners thus we will start i =1 and not 0. Similarly other corners occurs when i = m-1 ( not n as counting begins with 0), j=0 and j=n-1.
#Program for taking input through file and with count
#include <stdio.h>
int main(void) {
freopen("grid1.txt","r",stdin); // For opening a file to
read.
int m,n;
scanf("%d %d", &m,&n);
int arr[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
int count =0;
for(int i=1;i<m-1;i++)
for(int j=1;j<n-1;j++)
{
if(arr[i][j]>arr[i-1][j]
&& arr[i][j]>arr[i][j-1] &&
arr[i][j]>arr[i+1][j] && arr[i][j]>arr[i][j+1])
{
printf("%d %d",
i, j);
printf("\n");
count++; //
added count variable in the loop to get total no. of
peaks
}
}
printf("No.of Peaks is:%d", count);
return 0;
}
# if you want to print "count", before the indexes of peaks then we need to store indexes in an array and print two at a time (First one is row no. of peak and second one is column no. of peak)
#include <stdio.h>
int main(void) {
freopen("grid1.txt","r",stdin);
int m,n;
scanf("%d %d", &m,&n);
int arr[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
int count =0, PeakLoc[100]; //
PeakLoc array to store indexes of peak
for(int i=1;i<m-1;i++)
for(int j=1;j<n-1;j++)
{
if(arr[i][j]>arr[i-1][j]
&& arr[i][j]>arr[i][j-1] &&
arr[i][j]>arr[i+1][j] && arr[i][j]>arr[i][j+1])
{
PeakLoc[count++]=i; // storing value of row at first
index
PeakLoc[count++]=j; // storing value of column at second
index
}
}
printf("No.of Peaks is:%d\n", count/2);
for(int i=0;i<count;i=i+2) // Fetching two
values at a time for row and column thus increment by
two
{
printf("%d %d", PeakLoc[i],
PeakLoc[i+1]);
printf("\n");
}
return 0;
}