考虑一个维度为NxM的网格和一个由可用圆形障碍物组成的数组R ,任务是找到阻挡源[0, 0]和目的地[N-1, M ]之间路径所需的给定半径的圆形障碍物的最小数量-1] 。如果不可能,则打印 -1。
注意:圆形障碍物可以重叠,如示例 1 中的图像所示。
例子:
Input: N = 4, M = 5, R[] = {1.0, 1.5, 1.25}
Output: 2
Input: N = 10, M = 12, R[] = {1.0, 1.25}
Output: -1
方法:
- 找出是按行还是按列放置障碍物。
- 按降序对半径进行排序。
- 由于障碍物覆盖了半径为 R[i] 的整个圆,因此,对于直线,它覆盖了直径。
- 使用数组 R[] 中的较大值将 val 减少2 * Ri,直到它变为零。
- 使用所有障碍物后,当val <= 0 时返回使用的障碍物计数,如果使用所有障碍物后val > 0 ,则打印-1 。
下面是上述方法的实现。
CPP
// C++ program to find the minimum
// number of obstacles required
#include
using namespace std;
// Function to find the minimum
// number of obstacles required
int solve(int n, int m, int obstacles,
double range[])
{
// Find the minimum range required
// to put obstacles
double val = min(n, m);
// Sorting the radius
sort(range, range + obstacles);
int c = 1;
for (int i = obstacles - 1; i >= 0; i--) {
range[i] = 2 * range[i];
val -= range[i];
// If val is less than zero
// then we have find the number of
// obstacles required
if (val <= 0) {
return c;
}
else {
c++;
}
}
if (val > 0) {
return -1;
}
}
// Driver function
int main()
{
int n = 4, m = 5, obstacles = 3;
double range[] = { 1.0, 1.25, 1.15 };
cout << solve(n, m, obstacles, range) << "\n";
return 0;
}
Java
// Java program to find the minimum
// number of obstacles required
import java.util.*;
class GFG
{
// Function to find the minimum
// number of obstacles required
static int solve(int n, int m, int obstacles,
double range[])
{
// Find the minimum range required
// to put obstacles
double val = Math.min(n, m);
// Sorting the radius
Arrays.sort(range);
int c = 1;
for (int i = obstacles - 1; i >= 0; i--)
{
range[i] = 2 * range[i];
val -= range[i];
// If val is less than zero
// then we have find the number of
// obstacles required
if (val <= 0)
{
return c;
}
else
{
c++;
}
}
if (val > 0)
{
return -1;
}
return 0;
}
// Driver code
public static void main(String[] args)
{
int n = 4, m = 5, obstacles = 3;
double range[] = { 1.0, 1.25, 1.15 };
System.out.print(solve(n, m, obstacles, range)+ "\n");
}
}
// This code is contributed by PrinciRaj1992
C#
// C# program to find the minimum
// number of obstacles required
using System;
class GFG
{
// Function to find the minimum
// number of obstacles required
static int solve(int n, int m, int obstacles,
double []range)
{
// Find the minimum range required
// to put obstacles
double val = Math.Min(n, m);
// Sorting the radius
Array.Sort(range);
int c = 1;
for (int i = obstacles - 1; i >= 0; i--)
{
range[i] = 2 * range[i];
val -= range[i];
// If val is less than zero
// then we have find the number of
// obstacles required
if (val <= 0)
{
return c;
}
else
{
c++;
}
}
if (val > 0)
{
return -1;
}
return 0;
}
// Driver code
public static void Main()
{
int n = 4, m = 5, obstacles = 3;
double []range = { 1.0, 1.25, 1.15 };
Console.WriteLine(solve(n, m, obstacles, range));
}
}
// This code is contributed by AnkitRai01
Python3
# Python3 program to find the minimum
# number of obstacles required
# Function to find the minimum
# number of obstacles required
def solve(n, m, obstacles,rangee):
# Find the minimum rangee required
# to put obstacles
val = min(n, m)
# Sorting the radius
rangee = sorted(rangee)
c = 1
for i in range(obstacles - 1, -1, -1):
rangee[i] = 2 * rangee[i]
val -= rangee[i]
# If val is less than zero
# then we have find the number of
# obstacles required
if (val <= 0):
return c
else:
c += 1
if (val > 0):
return -1
# Driver code
n = 4
m = 5
obstacles = 3
rangee = [1.0, 1.25, 1.15]
print(solve(n, m, obstacles, rangee))
# This code is contributed by mohit kumar 29
Javascript
输出:
2
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。