Save from Bishop in chessboard
You are given a 8*8 chess board. Along with the chess board there is a Bishop placed on board and its position is known. Position of Bishop is given in form of two digit integer where both digits are greater than 0 and less than 9 (like 67 denotes 6th column and 7th row). Now your task is to find the number of ways in which you can place a pawn safely on the board.
Examples:
Input : Bishop’s Position = 11
Output : Safe Positions = 56
Input : Bishop’s Position = 44
Output : Safe Positions = 50
Brute Force Approach : One of the basic approach is to iterate through all the 64 possible positions on chess board and check whether that position is safe or not. This approach will require much more time.
Better Approach: As we know that movement of Bishop is in diagonal manner so from any position on the chess board a Bishop can move in both direction of both diagonals. So, all the positions which does not lie on the way of diagonal movement of the given Bishop are the safe positions.
Now our task is to find the maximum length in all possible four direction from the position of Bishop.
-> From any position a Bishop can move towards four corner that are (11, 18, 81, 88). So, we will try to find the find the maximum distance which the Bishop can move towards these corner.
Let position of bishop is i,j then:
- Distance towards 11 = min (mod(1-i), mod(1-j) ).
- Distance towards 18 = min (mod(1-i), mod(8-j) ).
- Distance towards 81 = min (mod(8-i), mod(1-j) ).
- Distance towards 88 = min (mod(8-i), mod(8-j) ).
Beside all these four, one position at which Bishop is already placed is also not safe so total number of unsafe position is sum of above results + 1. and total number of safe position is 64 -(sum+1).
C++
#include<bits/stdc++.h>
using namespace std;
int calcSafe( int pos)
{
int j = pos % 10;
int i = pos /10;
int dis_11 = min ( abs (1-i), abs (1-j));
int dis_18 = min ( abs (1-i), abs (8-j));
int dis_81 = min ( abs (8-i), abs (1-j));
int dis_88 = min ( abs (8-i), abs (8-j));
int sum = dis_11 + dis_18 + dis_81 + dis_88 + 1;
return (64- sum);
}
int main()
{
int pos = 34;
cout << "Safe Positions = " << calcSafe(pos);
return 0;
}
|
Java
class GFG
{
static int calcSafe( int pos)
{
int j = pos % 10 ;
int i = pos / 10 ;
int dis_11 = Math.min ( Math.abs( 1 -i), Math.abs ( 1 -j));
int dis_18 = Math.min ( Math.abs( 1 -i), Math.abs ( 8 -j));
int dis_81 = Math.min ( Math.abs( 8 -i), Math.abs ( 1 -j));
int dis_88 = Math.min ( Math.abs( 8 -i), Math.abs ( 8 -j));
int sum = dis_11 + dis_18 + dis_81 + dis_88 + 1 ;
return ( 64 - sum);
}
public static void main (String[] args)
{
int pos = 34 ;
System.out.print( "Safe Positions = " +calcSafe(pos));
}
}
|
Python3
import math
def calcSafe(pos):
j = pos % 10
i = pos / 10
dis_11 = min ( abs ( 1 - i), abs ( 1 - j))
dis_18 = min ( abs ( 1 - i), abs ( 8 - j))
dis_81 = min ( abs ( 8 - i), abs ( 1 - j))
dis_88 = min ( abs ( 8 - i), abs ( 8 - j))
sum = (dis_11 + dis_18 + dis_81
+ dis_88 + 1 )
return ( 64 - sum )
pos = 34
print ( "Safe Positions = " ,
math.ceil(calcSafe(pos)))
|
C#
using System;
class GFG {
static int calcSafe( int pos)
{
int j = pos % 10;
int i = pos / 10;
int dis_11 = Math.Min(Math.Abs(1 - i), Math.Abs(1 - j));
int dis_18 = Math.Min(Math.Abs(1 - i), Math.Abs(8 - j));
int dis_81 = Math.Min(Math.Abs(8 - i), Math.Abs(1 - j));
int dis_88 = Math.Min(Math.Abs(8 - i), Math.Abs(8 - j));
int sum = dis_11 + dis_18 + dis_81 + dis_88 + 1;
return (64 - sum);
}
public static void Main()
{
int pos = 34;
Console.WriteLine( "Safe Positions = " + calcSafe(pos));
}
}
|
Javascript
<script>
function calcSafe( pos)
{
let j = pos % 10;
let i = Math.floor(pos /10);
let dis_11 = Math.min( Math.abs(1-i), Math.abs(1-j));
let dis_18 = Math.min( Math.abs(1-i), Math.abs(8-j));
let dis_81 = Math.min( Math.abs(8-i), Math.abs(1-j));
let dis_88 = Math.min( Math.abs(8-i), Math.abs(8-j));
let sum = dis_11 + dis_18 + dis_81 + dis_88 + 1;
return (64- sum);
}
let pos = 34;
document.write( "Safe Positions = " + calcSafe(pos));
</script>
|
PHP
<?php
function calcSafe( $pos )
{
$j = $pos % 10;
$i = $pos /10;
$dis_11 = min( abs (1 - $i ),
abs (1 - $j ));
$dis_18 = min( abs (1 - $i ),
abs (8 - $j ));
$dis_81 = min( abs (8 - $i ),
abs (1 - $j ));
$dis_88 = min( abs (8 - $i ),
abs (8 - $j ));
$sum = $dis_11 + $dis_18 +
$dis_81 + $dis_88 + 1;
return ceil (64- $sum );
}
$pos = 34;
echo "Safe Positions = " ,calcSafe( $pos );
?>
|
Output
Safe Positions = 52
Time Complexity: O(1)
Auxiliary Space: O(1)
Last Updated :
31 Jul, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...