Given an NXN chessboard. The task is to check if the given chessboard is valid or not. A chess board is considered valid if every 2 adjacent cells are painted with different color. Two cells are considered adjacent if they share a boundary.

First chessboard is valid whereas the second is invalid.
Examples:
Input : N = 2
C = {
{ 1, 0 },
{ 0, 1 }
}
Output : Yes
Input : N = 2
C = {
{ 0, 0 },
{ 0, 0 }
}
Output : No
Observe, on a chess board, every adjacent pair of cells is painted in a different color.
So, for each cell (i, j), check whether the adjacent cells i.e
(i + 1, j), (i -1, j), (i, j + 1), (i, j – 1) is painted with different color than (i, j) or not.
Pseudocode:
int X[] = {0, -1, 0, 1};
int Y[] = {1, 0, -1, 0};
bool validateConfiguration(int M[N][N])
{
bool isValid = true;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < 4; k++)
{
int newX = i + X[k];
int newY = j + Y[k];
if (newX < N && newY < N && newX >= 0 &&
newY >= 0 && M[newX][newY] == M[i][j])
{
isValid = false;
}
}
}
}
return isValid;
}
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 2
bool isValid( int c[][MAX], int n)
{
int X[] = { 0, -1, 0, 1 };
int Y[] = { 1, 0, -1, 0 };
bool isValid = true ;
for ( int i = 0; i < n; i++) {
for ( int j = 0; j < n; j++) {
for ( int k = 0; k < 4; k++) {
int newX = i + X[k];
int newY = j + Y[k];
if (newX < n && newY < n && newX >= 0 &&
newY >= 0 && c[newX][newY] == c[i][j]) {
isValid = false ;
}
}
}
}
return isValid;
}
int main()
{
int n = 2;
int c[2][2] = { { 1, 0 },
{ 0, 1 } };
(isValid(c, n)) ? (cout << "Yes" ) : (cout << "No" );
return 0;
}
|
Java
class GFG
{
static int MAX = 2 ;
static boolean isValid( int c[][], int n)
{
int X[] = { 0 , - 1 , 0 , 1 };
int Y[] = { 1 , 0 , - 1 , 0 };
boolean isValid = true ;
for ( int i = 0 ; i < n; i++)
{
for ( int j = 0 ; j < n; j++)
{
for ( int k = 0 ; k < 4 ; k++)
{
int newX = i + X[k];
int newY = j + Y[k];
if (newX < n && newY < n &&
newX >= 0 && newY >= 0 &&
c[newX][newY] == c[i][j])
{
isValid = false ;
}
}
}
}
return isValid;
}
public static void main(String[] args)
{
int n = 2 ;
int [][] c = {{ 1 , 0 },
{ 0 , 1 }};
if (isValid(c, n))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python 3
MAX = 2
def isValid(c, n) :
X = [ 0 , - 1 , 0 , 1 ]
Y = [ 1 , 0 , - 1 , 0 ]
isValid = True
for i in range (n) :
for j in range (n) :
for k in range (n) :
newX = i + X[k]
newY = j + Y[k]
if (newX < n and newY < n and
newX > = 0 and newY > = 0 and
c[newX][newY] = = c[i][j]) :
isValid = false
return isValid
if __name__ = = "__main__" :
n = 2
c = [ [ 1 , 0 ],
[ 0 , 1 ] ]
if isValid(c, n) :
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static bool isValid( int [,] c, int n)
{
int [] X = { 0, -1, 0, 1 };
int [] Y = { 1, 0, -1, 0 };
bool isValid = true ;
for ( int i = 0; i < n; i++)
{
for ( int j = 0; j < n; j++)
{
for ( int k = 0; k < 4; k++)
{
int newX = i + X[k];
int newY = j + Y[k];
if (newX < n && newY < n &&
newX >= 0 && newY >= 0 &&
c[newX, newY] == c[i, j])
{
isValid = false ;
}
}
}
}
return isValid;
}
public static void Main()
{
int n = 2;
int [,] c = {{ 1, 0 },
{ 0, 1 }};
if (isValid(c, n))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
PHP
<?php
function isValid(& $c , $n )
{
$X = array ( 0, -1, 0, 1 );
$Y = array ( 1, 0, -1, 0 );
$isValid = true;
for ( $i = 0; $i < $n ; $i ++)
{
for ( $j = 0; $j < $n ; $j ++)
{
for ( $k = 0; $k < 4; $k ++)
{
$newX = $i + $X [ $k ];
$newY = $j + $Y [ $k ];
if ( $newX < $n && $newY < $n &&
$newX >= 0 && $newY >= 0 &&
$c [ $newX ][ $newY ] == $c [ $i ][ $j ])
{
$isValid = false;
}
}
}
}
return $isValid ;
}
$n = 2;
$c = array ( array (1, 0),
array (0, 1));
echo (isValid( $c , $n )) ? "Yes" : "No" ;
?>
|
Javascript
<script>
var MAX = 2;
function isValid(c, n)
{
var X = [ 0, -1, 0, 1 ];
var Y = [ 1, 0, -1, 0 ];
var isValid = true ;
for ( var i = 0; i < n; i++) {
for ( var j = 0; j < n; j++) {
for ( var k = 0; k < 4; k++) {
var newX = i + X[k];
var newY = j + Y[k];
if (newX < n && newY < n &&
newX >= 0 &&
newY >= 0 &&
c[newX][newY] == c[i][j]) {
isValid = false ;
}
}
}
}
return isValid;
}
var n = 2;
var c = [ [ 1, 0 ],
[ 0, 1 ] ];
(isValid(c, n)) ? (document.write( "Yes" )) :
(document.write( "No" ));
</script>
|
Time complexity: O(N^2) for given an N*N chessboard
Auxiliary space: O(1)
Implementation: A simpler approach would be to check if the cells with even sums are of the same color.
C++
#include <bits/stdc++.h>
using namespace std;
bool checkBoard(vector<vector< int >> board)
{
int base = board[0][0];
bool flag = true ;
for ( int i = 0; i < board.size(); i++)
{
for ( int j = 0; j < board[i].size(); j++)
{
if (( i + j ) % 2 == 0)
{
if ( board[i][j] != base )
{
return false ;
}
}
else
{
if (board[i][j] == base)
{
return false ;
}
}
}
}
return true ;
}
int main()
{
vector<vector< int >> board1={{0, 1},
{1, 0}};
vector<vector< int >> board2={{1, 0, 1},
{0, 1, 0},
{1, 0, 1}};
vector<vector< int >> board3={{1, 0, 1},
{0, 1, 0},
{1, 1, 1}};
if (checkBoard(board1))
cout << "true\n" ;
else
cout << "false\n" ;
if (checkBoard(board2))
cout << "true\n" ;
else
cout << "false\n" ;
if (checkBoard(board3))
cout << "true\n" ;
else
cout << "false\n" ;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static boolean checkBoard( int [][] board)
{
int base = board[ 0 ][ 0 ];
boolean flag = true ;
for ( int i = 0 ; i < board.length; i++)
{
for ( int j = 0 ; j < board[i].length; j++)
{
if (( i + j ) % 2 == 0 )
{
if ( board[i][j] != base )
{
return false ;
}
}
else
{
if (board[i][j] == base)
{
return false ;
}
}
}
}
return true ;
}
public static void main (String[] args) {
int [][] board1={{ 0 , 1 }, { 1 , 0 }};
int [][] board2={{ 1 , 0 , 1 },{ 0 , 1 , 0 },{ 1 , 0 , 1 }};
int [][] board3={{ 1 , 0 , 1 },{ 0 , 1 , 0 },{ 1 , 1 , 1 }};
System.out.println(checkBoard(board1));
System.out.println(checkBoard(board2));
System.out.println(checkBoard(board3));
}
}
|
Python3
def checkBoard(board) :
base = board[ 0 ][ 0 ]
flag = True
for i in range ( len (board)) :
for j in range ( len (board[i])) :
if ( i + j ) % 2 = = 0 :
if board[i][j] ! = base :
return False
else :
if board[i][j] = = base :
return False
return True
board1 = [[ 0 , 1 ], [ 1 , 0 ]]
board2 = [[ 1 , 0 , 1 ], [ 0 , 1 , 0 ], [ 1 , 0 , 1 ]]
board3 = [[ 1 , 0 , 1 ], [ 0 , 1 , 0 ], [ 1 , 1 , 1 ]]
print (checkBoard(board1))
print (checkBoard(board2))
print (checkBoard(board3))
|
C#
using System;
public class GFG
{
static bool checkBoard( int [,] board)
{
int Base = board[0, 0];
for ( int i = 0; i < board.GetLength(0); i++)
{
for ( int j = 0; j < board.GetLength(1); j++)
{
if (( i + j ) % 2 == 0)
{
if ( board[i, j] != Base )
{
return false ;
}
}
else
{
if (board[i, j] == Base)
{
return false ;
}
}
}
}
return true ;
}
static public void Main ()
{
int [,] board1 = {{0, 1}, {1, 0}};
int [,] board2 = {{1, 0, 1},{0, 1, 0},{1, 0, 1}};
int [,] board3 = {{1, 0, 1},{0, 1, 0},{1, 1, 1}};
Console.WriteLine(checkBoard(board1));
Console.WriteLine(checkBoard(board2));
Console.WriteLine(checkBoard(board3));
}
}
|
Javascript
<script>
function checkBoard(board)
{
let base = board[0][0];
let flag = true ;
for (let i = 0; i < board.length; i++)
{
for ( let j = 0; j < board[i].length; j++)
{
if (( i + j ) % 2 == 0)
{
if ( board[i][j] != base )
{
return false ;
}
}
else
{
if (board[i][j] == base)
{
return false ;
}
}
}
}
return true ;
}
let board1 = [[0, 1], [1, 0]];
let board2 = [[1, 0, 1], [0, 1, 0], [1, 0, 1]];
let board3 = [[1, 0, 1], [0, 1, 0], [1, 1, 1]];
document.write(checkBoard(board1)+ "<br>" )
document.write(checkBoard(board2)+ "<br>" )
document.write(checkBoard(board3)+ "<br>" )
</script>
|
Time complexity: O(N^2) for given an N*N chessboard
Auxiliary space: O(1)
Please Login to comment...