Number of rectangles in a circle of radius R
Given a circular sheet of radius R and the task is to find the total number of rectangles with integral length and width that can be cut from the circular sheet, one at a time.
Examples:
Input: R = 2
Output: 8
8 rectangles can be cut from a circular sheet of radius 2.
These are: 1×1, 1×2, 2×1, 2×2, 1×3, 3×1, 2×3, 3×2.
Input: R = 1
Output: 1
Only one rectangle with dimensions 1 X 1 is possible.
Approach
Consider the following diagram,
Its easy to see, that ABCD is the largest rectangle that can be formed in the given circle with radius R and centre O, having dimensions a X b
Drop a perpendicular AO such that, ∠AOD = ∠AOB = 90°
Consider the following diagram for further analysis,
Consider triangles AOD and AOB,
In these triangles,
AO = AO (Common Side)
∠AOD = ∠AOB = 90°
OD = OB = R
Thus, by SAS congruence ▵AOD ≅ ▵AOB
∴ AD = AB by CPCT(i.e Corresponding Parts on Congruent Triangles)
or, a = b
=> The rectangle ABCD is a square
The diameter BD is the maximum diagonal the rectangle can have to be able to be cut from the Circular Sheet.
Thus, all the combinations of a and b can be checked to form all possible rectangles, and if the diagonal of any such rectangle is less than or equal to the length of the diagonal of the largest rectangle formed (i.e 2 * R, where R is the Radius of the circle as explained above)
Now, the maximum length of a and b will always be strictly less than the diameter of the circle so all possible values of a and b will lie in the closed interval [1, (2 * R – 1)].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int countRectangles( int radius)
{
int rectangles = 0;
int diameter = 2 * radius;
int diameterSquare = diameter * diameter;
for ( int a = 1; a < 2 * radius; a++) {
for ( int b = 1; b < 2 * radius; b++) {
int diagonalLengthSquare = (a * a + b * b);
if (diagonalLengthSquare <= diameterSquare) {
rectangles++;
}
}
}
return rectangles;
}
int main()
{
int radius = 2;
int totalRectangles;
totalRectangles = countRectangles(radius);
cout << totalRectangles << " rectangles can be"
<< "cut from a circle of Radius " << radius;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int countRectangles( int radius)
{
int rectangles = 0 ;
int diameter = 2 * radius;
int diameterSquare = diameter *
diameter;
for ( int a = 1 ;
a < 2 * radius; a++)
{
for ( int b = 1 ;
b < 2 * radius; b++)
{
int diagonalLengthSquare = (a * a +
b * b);
if (diagonalLengthSquare <= diameterSquare)
{
rectangles++;
}
}
}
return rectangles;
}
public static void main (String[] args)
{
int radius = 2 ;
int totalRectangles;
totalRectangles = countRectangles(radius);
System.out.println(totalRectangles +
" rectangles can be " +
"cut from a circle of" +
" Radius " + radius);
}
}
|
Python3
def countRectangles(radius):
rectangles = 0
diameter = 2 * radius
diameterSquare = diameter * diameter
for a in range ( 1 , 2 * radius):
for b in range ( 1 , 2 * radius):
diagonalLengthSquare = (a * a +
b * b)
if (diagonalLengthSquare < = diameterSquare) :
rectangles + = 1
return rectangles
radius = 2
totalRectangles = countRectangles(radius)
print (totalRectangles , "rectangles can be" ,
"cut from a circle of Radius" , radius)
|
C#
using System;
class GFG
{
static int countRectangles( int radius)
{
int rectangles = 0;
int diameter = 2 * radius;
int diameterSquare = diameter *
diameter;
for ( int a = 1;
a < 2 * radius; a++)
{
for ( int b = 1;
b < 2 * radius; b++)
{
int diagonalLengthSquare = (a * a +
b * b);
if (diagonalLengthSquare <=
diameterSquare)
{
rectangles++;
}
}
}
return rectangles;
}
public static void Main ()
{
int radius = 2;
int totalRectangles;
totalRectangles = countRectangles(radius);
Console.WriteLine(totalRectangles +
" rectangles can be " +
"cut from a circle of" +
" Radius " + radius);
}
}
|
PHP
<?php
function countRectangles( $radius )
{
$rectangles = 0;
$diameter = 2 * $radius ;
$diameterSquare = $diameter *
$diameter ;
for ( $a = 1;
$a < 2 * $radius ; $a ++)
{
for ( $b = 1;
$b < 2 * $radius ; $b ++)
{
$diagonalLengthSquare = ( $a * $a +
$b * $b );
if ( $diagonalLengthSquare <= $diameterSquare )
{
$rectangles ++;
}
}
}
return $rectangles ;
}
$radius = 2;
$totalRectangles ;
$totalRectangles = countRectangles( $radius );
echo $totalRectangles , " rectangles can be " ,
"cut from a circle of Radius " , $radius ;
?>
|
Javascript
<script>
function countRectangles(radius)
{
let rectangles = 0;
let diameter = 2 * radius;
let diameterSquare = diameter *
diameter;
for (let a = 1;a < 2 * radius; a++)
{
for (let b = 1;
b < 2 * radius; b++)
{
let diagonalLengthSquare = (a * a +
b * b);
if (diagonalLengthSquare <= diameterSquare)
{
rectangles++;
}
}
}
return rectangles;
}
let radius = 2;
let totalRectangles;
totalRectangles = countRectangles(radius);
document.write( totalRectangles + " rectangles can be cut from a circle of Radius " +radius);
</script>
|
Output:
8 rectangles can be cut from a circle of Radius 2
Time Complexity: O(R2), where R is the Radius of the Circle
Space Complexity: O(1) since using constant variables
Last Updated :
28 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...