给定二进制整数数组,假设这些值以相等的距离保留在圆的圆周上。我们需要确定是否可以仅使用1s作为顶点绘制规则多边形,如果可以,则打印规则多边形具有的最大边数。
例子:
输入:arr [] = [1,1,1,0,1,0]输出:边长为3的可能多边形我们可以绘制一个以1s为顶点的正三角形,如下图(a)所示。输入:arr [] = [1,0,1,0,1,0,1,0,1,1]输出:边长为5的多边形我们可以绘制一个顶点为1s的正五边形,如下所示图(b)。
我们可以通过获取可能的多边形可以拥有的顶点数量与数组中值总数之间的关系来解决此问题。让一个可能的规则多边形在圆中具有K个顶点或K个边,那么它应该满足两个条件才能成为答案:
如果给定的数组大小为N,则K应该除以N,否则K个顶点不能以相等的方式将N个顶点除以成为规则多边形。
接下来的事情是,所选多边形的每个顶点都应该有一个顶点。
经过以上几点,我们可以看到,要解决此问题,我们需要遍历N的除数,然后检查数组在选定除数距离处的每个值是否为1。如果为1,那么我们找到了解决方案。我们只需迭代1到sqrt(N)就可以迭代O(sqrt(N))时间中的所有除数。您可以在此处了解更多有关此内容的信息。
C++
// C++ program to find whether a regular polygon
// is possible in circle with 1s as vertices
#include
using namespace std;
// method returns true if polygon is possible with
// 'midpoints' number of midpoints
bool checkPolygonWithMidpoints(int arr[], int N,
int midpoints)
{
// loop for getting first vertex of polygon
for (int j = 0; j < midpoints; j++)
{
int val = 1;
// loop over array values at 'midpoints' distance
for (int k = j; k < N; k += midpoints)
{
// and(&) all those values, if even one of
// them is 0, val will be 0
val &= arr[k];
}
/* if val is still 1 and (N/midpoints) or (number
of vertices) are more than two (for a polygon
minimum) print result and return true */
if (val && N/midpoints > 2)
{
cout << "Polygon possible with side length " <<
<< (N/midpoints) << endl;
return true;
}
}
return false;
}
// method prints sides in the polygon or print not
// possible in case of no possible polygon
void isPolygonPossible(int arr[], int N)
{
// limit for iterating over divisors
int limit = sqrt(N);
for (int i = 1; i <= limit; i++)
{
// If i divides N then i and (N/i) will
// be divisors
if (N % i == 0)
{
// check polygon for both divisors
if (checkPolygonWithMidpoints(arr, N, i) ||
checkPolygonWithMidpoints(arr, N, (N/i)))
return;
}
}
cout << "Not possiblen";
}
// Driver code to test above methods
int main()
{
int arr[] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 1};
int N = sizeof(arr) / sizeof(arr[0]);
isPolygonPossible(arr, N);
return 0;
}
Java
// Java program to find whether a regular polygon
// is possible in circle with 1s as vertices
class Test
{
// method returns true if polygon is possible with
// 'midpoints' number of midpoints
static boolean checkPolygonWithMidpoints(int arr[], int N,
int midpoints)
{
// loop for getting first vertex of polygon
for (int j = 0; j < midpoints; j++)
{
int val = 1;
// loop over array values at 'midpoints' distance
for (int k = j; k < N; k += midpoints)
{
// and(&) all those values, if even one of
// them is 0, val will be 0
val &= arr[k];
}
/* if val is still 1 and (N/midpoints) or (number
of vertices) are more than two (for a polygon
minimum) print result and return true */
if (val != 0 && N/midpoints > 2)
{
System.out.println("Polygon possible with side length " +
N/midpoints);
return true;
}
}
return false;
}
// method prints sides in the polygon or print not
// possible in case of no possible polygon
static void isPolygonPossible(int arr[], int N)
{
// limit for iterating over divisors
int limit = (int)Math.sqrt(N);
for (int i = 1; i <= limit; i++)
{
// If i divides N then i and (N/i) will
// be divisors
if (N % i == 0)
{
// check polygon for both divisors
if (checkPolygonWithMidpoints(arr, N, i) ||
checkPolygonWithMidpoints(arr, N, (N/i)))
return;
}
}
System.out.println("Not possible");
}
// Driver method
public static void main(String args[])
{
int arr[] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 1};
isPolygonPossible(arr, arr.length);
}
}
Python3
# Python3 program to find whether a
# regular polygon is possible in circle
# with 1s as vertices
from math import sqrt
# method returns true if polygon is
# possible with 'midpoints' number
# of midpoints
def checkPolygonWithMidpoints(arr, N, midpoints) :
# loop for getting first vertex of polygon
for j in range(midpoints) :
val = 1
# loop over array values at
# 'midpoints' distance
for k in range(j , N, midpoints) :
# and(&) all those values, if even
# one of them is 0, val will be 0
val &= arr[k]
# if val is still 1 and (N/midpoints) or (number
# of vertices) are more than two (for a polygon
# minimum) print result and return true
if (val and N // midpoints > 2) :
print("Polygon possible with side length" ,
(N // midpoints))
return True
return False
# method prints sides in the polygon or print
# not possible in case of no possible polygon
def isPolygonPossible(arr, N) :
# limit for iterating over divisors
limit = sqrt(N)
for i in range(1, int(limit) + 1) :
# If i divides N then i and (N/i)
# will be divisors
if (N % i == 0) :
# check polygon for both divisors
if (checkPolygonWithMidpoints(arr, N, i) or
checkPolygonWithMidpoints(arr, N, (N // i))):
return
print("Not possiblen")
# Driver code
if __name__ == "__main__" :
arr = [1, 0, 1, 0, 1, 0, 1, 0, 1, 1]
N = len(arr)
isPolygonPossible(arr, N)
# This code is contributed by Ryuga
C#
// C# program to find whether
// a regular polygon is possible
// in circle with 1s as vertices
using System;
class GFG
{
// method returns true if
// polygon is possible
// with 'midpoints' number
// of midpoints
static bool checkPolygonWithMidpoints(int []arr, int N,
int midpoints)
{
// loop for getting first
// vertex of polygon
for (int j = 0; j < midpoints; j++)
{
int val = 1;
// loop over array values
// at 'midpoints' distance
for (int k = j; k < N; k += midpoints)
{
// and(&) all those values,
// if even one of them is 0,
// val will be 0
val &= arr[k];
}
/* if val is still 1 and
(N/midpoints) or (number
of vertices) are more than
two (for a polygon minimum)
print result and return true */
if (val != 0 && N / midpoints > 2)
{
Console.WriteLine("Polygon possible with " +
"side length " +
N / midpoints);
return true;
}
}
return false;
}
// method prints sides in the
// polygon or print not possible
// in case of no possible polygon
static void isPolygonPossible(int []arr,
int N)
{
// limit for iterating
// over divisors
int limit = (int)Math.Sqrt(N);
for (int i = 1; i <= limit; i++)
{
// If i divides N then i
// and (N/i) will be divisors
if (N % i == 0)
{
// check polygon for
// both divisors
if (checkPolygonWithMidpoints(arr, N, i) ||
checkPolygonWithMidpoints(arr, N, (N / i)))
return;
}
}
Console.WriteLine("Not possible");
}
// Driver Code
static public void Main ()
{
int []arr = {1, 0, 1, 0, 1,
0, 1, 0, 1, 1};
isPolygonPossible(arr, arr.Length);
}
}
// This code is contributed by jit_t
PHP
2)
{
echo "Polygon possible with side length " ,
($N / $midpoints) , "\n";
return true;
}
}
return false;
}
// method prints sides in
// the polygon or print not
// possible in case of no
// possible polygon
function isPolygonPossible($arr, $N)
{
// limit for iterating
// over divisors
$limit = sqrt($N);
for ($i = 1; $i <= $limit; $i++)
{
// If i divides N then
// i and (N/i) will be
// divisors
if ($N % $i == 0)
{
// check polygon for
// both divisors
if (checkPolygonWithMidpoints($arr, $N, $i) ||
checkPolygonWithMidpoints($arr, $N, ($N / $i)))
return;
}
}
echo "Not possiblen";
}
// Driver Code
$arr = array(1, 0, 1, 0, 1,
0, 1, 0, 1, 1);
$N = sizeof($arr);
isPolygonPossible($arr, $N);
// This code is contributed by ajit
?>
输出:
Polygon possible with side length 5