Validity of a given Tic-Tac-Toe board configuration
Last Updated :
11 Aug, 2023
A Tic-Tac-Toe board is given after some moves are played. Find out if the given board is valid, i.e., is it possible to reach this board position after some moves or not.
Note that every arbitrary filled grid of 9 spaces isn't valid e.g. a grid filled with 3 X and 6 O isn't valid situation because each player needs to take alternate turns.

Input is given as a 1D array of size 9.
Examples:
Input: board[] = {'X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X'};
Output: Valid
Input: board[] = {'O', 'X', 'X',
'O', 'X', 'X',
'O', 'O', 'X'};
Output: Invalid
(Both X and O cannot win)
Input: board[] = {'O', 'X', ' ',
' ', ' ', ' ',
' ', ' ', ' '};
Output: Valid
(Valid board with only two moves played)
Basically, to find the validity of an input grid, we can think of the conditions when an input grid is invalid. Let no. of "X"s be countX and no. of "O"s be countO. Since we know that the game starts with X, a given grid of Tic-Tac-Toe game would be definitely invalid if following two conditions meet
- countX != countO AND
- countX != countO + 1
- Since "X" is always the first move, second condition is also required.
- Now does it mean that all the remaining board positions are valid one? The answer is NO. Think of the cases when input grid is such that both X and O are making straight lines. This is also not
- valid position because the game ends when one player wins. So we need to check the following condition as well
- If input grid shows that both the players are in winning situation, it's an invalid position.
- If input grid shows that the player with O has put a straight-line (i.e. is in win condition) and countX != countO, it's an invalid position. The reason is that O plays his move only after X plays his
- move. Since X has started the game, O would win when both X and O has played equal no. of moves.
- If input grid shows that X is in winning condition than xCount must be one greater that oCount.
- Armed with above conditions i.e. a), b), c) and d), we can now easily formulate an algorithm/program to check the validity of a given Tic-Tac-Toe board position.
1) countX == countO or countX == countO + 1
2) If O is in win condition then check
a) If X also wins, not valid
b) If xbox != obox , not valid
3) If X is in win condition then check if xCount is
one more than oCount or not
Another way to find the validity of a given board is using 'inverse method' i.e. rule out all the possibilities when a given board is invalid.
C++
// C++ program to check whether a given tic tac toe
// board is valid or not
#include <iostream>
using namespace std;
// This matrix is used to find indexes to check all
// possible winning triplets in board[0..8]
int win[8][3] = {{0, 1, 2}, // Check first row.
{3, 4, 5}, // Check second Row
{6, 7, 8}, // Check third Row
{0, 3, 6}, // Check first column
{1, 4, 7}, // Check second Column
{2, 5, 8}, // Check third Column
{0, 4, 8}, // Check first Diagonal
{2, 4, 6}}; // Check second Diagonal
// Returns true if character 'c' wins. c can be either
// 'X' or 'O'
bool isCWin(char *board, char c)
{
// Check all possible winning combinations
for (int i=0; i<8; i++)
if (board[win[i][0]] == c &&
board[win[i][1]] == c &&
board[win[i][2]] == c )
return true;
return false;
}
// Returns true if given board is valid, else returns false
bool isValid(char board[9])
{
// Count number of 'X' and 'O' in the given board
int xCount=0, oCount=0;
for (int i=0; i<9; i++)
{
if (board[i]=='X') xCount++;
if (board[i]=='O') oCount++;
}
// Board can be valid only if either xCount and oCount
// is same or count is one more than oCount
if (xCount==oCount || xCount==oCount+1)
{
// Check if 'O' is winner
if (isCWin(board, 'O'))
{
// Check if 'X' is also winner, then
// return false
if (isCWin(board, 'X'))
return false;
// Else return true xCount and yCount are same
return (xCount == oCount);
}
// If 'X' wins, then count of X must be greater
if (isCWin(board, 'X') && xCount != oCount + 1)
return false;
// If 'O' is not winner, then return true
return true;
}
return false;
}
// Driver program
int main()
{
char board[] = {'X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X'};
(isValid(board))? cout << "Given board is valid":
cout << "Given board is not valid";
return 0;
}
Java
// Java program to check whether a given tic tac toe
// board is valid or not
import java.io.*;
class GFG {
// This matrix is used to find indexes to check all
// possible winning triplets in board[0..8]
static int win[][] = {{0, 1, 2}, // Check first row.
{3, 4, 5}, // Check second Row
{6, 7, 8}, // Check third Row
{0, 3, 6}, // Check first column
{1, 4, 7}, // Check second Column
{2, 5, 8}, // Check third Column
{0, 4, 8}, // Check first Diagonal
{2, 4, 6}}; // Check second Diagonal
// Returns true if character 'c' wins. c can be either
// 'X' or 'O'
static boolean isCWin(char[] board, char c) {
// Check all possible winning combinations
for (int i = 0; i < 8; i++) {
if (board[win[i][0]] == c
&& board[win[i][1]] == c
&& board[win[i][2]] == c) {
return true;
}
}
return false;
}
// Returns true if given board is valid, else returns false
static boolean isValid(char board[]) {
// Count number of 'X' and 'O' in the given board
int xCount = 0, oCount = 0;
for (int i = 0; i < 9; i++) {
if (board[i] == 'X') {
xCount++;
}
if (board[i] == 'O') {
oCount++;
}
}
// Board can be valid only if either xCount and oCount
// is same or count is one more than oCount
if (xCount == oCount || xCount == oCount + 1) {
// Check if 'O' is winner
if (isCWin(board, 'O')) {
// Check if 'X' is also winner, then
// return false
if (isCWin(board, 'X')) {
return false;
}
// Else return true xCount and yCount are same
return (xCount == oCount);
}
// If 'X' wins, then count of X must be greater
if (isCWin(board, 'X') && xCount != oCount + 1) {
return false;
}
// If 'O' is not winner, then return true
return true;
}
return false;
}
// Driver program
public static void main(String[] args) {
char board[] = {'X', 'X', 'O', 'O', 'O', 'X', 'X', 'O', 'X'};
if ((isValid(board))) {
System.out.println("Given board is valid");
} else {
System.out.println("Given board is not valid");
}
}
}
//this code contributed by PrinciRaj1992
Python3
# Python3 program to check whether a given tic tac toe
# board is valid or not
# Returns true if char wins. Char can be either
# 'X' or 'O'
def win_check(arr, char):
# Check all possible winning combinations
matches = [[0, 1, 2], [3, 4, 5],
[6, 7, 8], [0, 3, 6],
[1, 4, 7], [2, 5, 8],
[0, 4, 8], [2, 4, 6]]
for i in range(8):
if(arr[(matches[i][0])] == char and
arr[(matches[i][1])] == char and
arr[(matches[i][2])] == char):
return True
return False
def is_valid(arr):
# Count number of 'X' and 'O' in the given board
xcount = arr.count('X')
ocount = arr.count('O')
# Board can be valid only if either xcount and ocount
# is same or count is one more than oCount
if(xcount == ocount+1 or xcount == ocount):
# Check if O wins
if win_check(arr, 'O'):
# Check if X wins, At a given point only one can win,
# if X also wins then return Invalid
if win_check(arr, 'X'):
return "Invalid"
# O can only win if xcount == ocount in case where whole
# board has values in each position.
if xcount == ocount:
return "Valid"
# If X wins then it should be xc == oc + 1,
# If not return Invalid
if win_check(arr, 'X') and xcount != ocount+1:
return "Invalid"
# if O is not the winner return Valid
if not win_check(arr, 'O'):
return "valid"
# If nothing above matches return invalid
return "Invalid"
# Driver Code
arr = ['X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X']
print("Given board is " + is_valid(arr))
C#
// C# program to check whether a given
// tic tac toe board is valid or not
using System;
class GFG
{
// This matrix is used to find indexes
// to check all possible winning triplets
// in board[0..8]
public static int[][] win = new int[][]
{
new int[] {0, 1, 2},
new int[] {3, 4, 5},
new int[] {6, 7, 8},
new int[] {0, 3, 6},
new int[] {1, 4, 7},
new int[] {2, 5, 8},
new int[] {0, 4, 8},
new int[] {2, 4, 6}
};
// Returns true if character 'c'
// wins. c can be either 'X' or 'O'
public static bool isCWin(char[] board,
char c)
{
// Check all possible winning
// combinations
for (int i = 0; i < 8; i++)
{
if (board[win[i][0]] == c &&
board[win[i][1]] == c &&
board[win[i][2]] == c)
{
return true;
}
}
return false;
}
// Returns true if given board
// is valid, else returns false
public static bool isValid(char[] board)
{
// Count number of 'X' and
// 'O' in the given board
int xCount = 0, oCount = 0;
for (int i = 0; i < 9; i++)
{
if (board[i] == 'X')
{
xCount++;
}
if (board[i] == 'O')
{
oCount++;
}
}
// Board can be valid only if either
// xCount and oCount is same or count
// is one more than oCount
if (xCount == oCount ||
xCount == oCount + 1)
{
// Check if 'O' is winner
if (isCWin(board, 'O'))
{
// Check if 'X' is also winner,
// then return false
if (isCWin(board, 'X'))
{
return false;
}
// Else return true xCount
// and yCount are same
return (xCount == oCount);
}
// If 'X' wins, then count of
// X must be greater
if (isCWin(board, 'X') &&
xCount != oCount + 1)
{
return false;
}
// If 'O' is not winner,
// then return true
return true;
}
return false;
}
// Driver Code
public static void Main(string[] args)
{
char[] board = new char[] {'X', 'X', 'O', 'O', 'O',
'X', 'X', 'O', 'X'};
if ((isValid(board)))
{
Console.WriteLine("Given board is valid");
}
else
{
Console.WriteLine("Given board is not valid");
}
}
}
// This code is contributed by Shrikant13
JavaScript
<script>
// Javascript program to check whether a given
// tic tac toe board is valid or not
// This matrix is used to find indexes
// to check all possible winning triplets
// in board[0..8]
// Returns true if character 'c' wins.
// c can be either 'X' or 'O'
function isCWin(board, c)
{
let win = new Array(new Array(0, 1, 2), // Check first row.
new Array(3, 4, 5), // Check second Row
new Array(6, 7, 8), // Check third Row
new Array(0, 3, 6), // Check first column
new Array(1, 4, 7), // Check second Column
new Array(2, 5, 8), // Check third Column
new Array(0, 4, 8), // Check first Diagonal
new Array(2, 4, 6)); // Check second Diagonal
// Check all possible winning combinations
for (let i = 0; i < 8; i++)
if (board[win[i][0]] == c &&
board[win[i][1]] == c &&
board[win[i][2]] == c )
return true;
return false;
}
// Returns true if given board is
// valid, else returns false
function isValid(board)
{
// Count number of 'X' and 'O'
// in the given board
let xCount = 0;
let oCount = 0;
for (let i = 0; i < 9; i++)
{
if (board[i] == 'X') xCount++;
if (board[i] == 'O') oCount++;
}
// Board can be valid only if either
// xCount and oCount is same or count
// is one more than oCount
if (xCount == oCount || xCount == oCount + 1)
{
// Check if 'O' is winner
if (isCWin(board, 'O'))
{
// Check if 'X' is also winner,
// then return false
if (isCWin(board, 'X'))
return false;
// Else return true xCount and
// yCount are same
return (xCount == oCount);
}
// If 'X' wins, then count of X
// must be greater
if (isCWin(board, 'X') &&
xCount != oCount + 1)
return false;
// If 'O' is not winner, then
// return true
return true;
}
return false;
}
// Driver Code
let board = new Array('X', 'X', 'O','O',
'O', 'X','X', 'O', 'X');
if(isValid(board))
document.write("Given board is valid");
else
document.write("Given board is not valid");
// This code is contributed
// by Saurabh Jaiswal
</script>
PHP
<?php
// PHP program to check whether a given
// tic tac toe board is valid or not
// This matrix is used to find indexes
// to check all possible winning triplets
// in board[0..8]
// Returns true if character 'c' wins.
// c can be either 'X' or 'O'
function isCWin($board, $c)
{
$win = array(array(0, 1, 2), // Check first row.
array(3, 4, 5), // Check second Row
array(6, 7, 8), // Check third Row
array(0, 3, 6), // Check first column
array(1, 4, 7), // Check second Column
array(2, 5, 8), // Check third Column
array(0, 4, 8), // Check first Diagonal
array(2, 4, 6)); // Check second Diagonal
// Check all possible winning combinations
for ($i = 0; $i < 8; $i++)
if ($board[$win[$i][0]] == $c &&
$board[$win[$i][1]] == $c &&
$board[$win[$i][2]] == $c )
return true;
return false;
}
// Returns true if given board is
// valid, else returns false
function isValid(&$board)
{
// Count number of 'X' and 'O'
// in the given board
$xCount = 0;
$oCount = 0;
for ($i = 0; $i < 9; $i++)
{
if ($board[$i] == 'X') $xCount++;
if ($board[$i] == 'O') $oCount++;
}
// Board can be valid only if either
// xCount and oCount is same or count
// is one more than oCount
if ($xCount == $oCount || $xCount == $oCount + 1)
{
// Check if 'O' is winner
if (isCWin($board, 'O'))
{
// Check if 'X' is also winner,
// then return false
if (isCWin($board, 'X'))
return false;
// Else return true xCount and
// yCount are same
return ($xCount == $oCount);
}
// If 'X' wins, then count of X
// must be greater
if (isCWin($board, 'X') &&
$xCount != $oCount + 1)
return false;
// If 'O' is not winner, then
// return true
return true;
}
return false;
}
// Driver Code
$board = array('X', 'X', 'O','O',
'O', 'X','X', 'O', 'X');
if(isValid($board))
echo("Given board is valid");
else
echo ("Given board is not valid");
// This code is contributed
// by Shivi_Aggarwal
?>
OutputGiven board is valid
Time complexity: O(1)
Auxiliary Space: O(1), since no extra space has been taken.
Approach 2:
The algorithm to check if a Tic-Tac-Toe board is valid or not is as follows:
- Initialize a 2D array win of size 8x3, which contains all possible winning combinations in Tic-Tac-Toe. Each row of the win array represents a winning combination, and each element in a row represents a cell index on the board.
- Define a function isCWin(board, c) which takes a board configuration board and a character c ('X' or 'O') as inputs, and returns true if character c has won on the board.
- Inside the isCWin function, iterate over each row of the win array. Check if the board has the same character c at all three cell indices of the current row. If yes, return true, as the character c has won.
- Define a function isValid(board) which takes a board configuration board as input, and returns true if the board is valid, else returns false.
- Inside the isValid function, count the number of 'X' and 'O' characters on the board, and store them in xCount and oCount variables, respectively.
- The board can be valid only if either xCount and oCount are the same, or xCount is one more than oCount.
- If 'O' is a winner on the board, check if 'X' is also a winner. If yes, return false as both 'X' and 'O' cannot win at the same time. If not, return true if xCount and oCount are the same, else return false.
- If 'X' is a winner on the board, then xCount must be one more than oCount. If not, return false.
- If 'O' is not a winner, return true as the board is valid.
Here is the code of the above approach:
C++
// Returns true if character 'c' wins. c can be either
// 'X' or 'O'
#include<bits/stdc++.h>
using namespace std;
bool isWinner(char *board, char c)
{
// Check all possible winning combinations
if ((board[0] == c && board[1] == c && board[2] == c) ||
(board[3] == c && board[4] == c && board[5] == c) ||
(board[6] == c && board[7] == c && board[8] == c) ||
(board[0] == c && board[3] == c && board[6] == c) ||
(board[1] == c && board[4] == c && board[7] == c) ||
(board[2] == c && board[5] == c && board[8] == c) ||
(board[0] == c && board[4] == c && board[8] == c) ||
(board[2] == c && board[4] == c && board[6] == c))
return true;
return false;
}
// Returns true if given board is valid, else returns false
bool isValid(char board[9])
{
// Count number of 'X' and 'O' in the given board
int xCount=0, oCount=0;
for (int i=0; i<9; i++)
{
if (board[i]=='X') xCount++;
if (board[i]=='O') oCount++;
}
// Board can be valid only if either xCount and oCount
// is same or count is one more than oCount
if (xCount==oCount || xCount==oCount+1)
{
// Check if there is only one winner
if (isWinner(board, 'X') && isWinner(board, 'O'))
return false;
// If 'X' wins, then count of X must be greater
if (isWinner(board, 'X') && xCount != oCount + 1)
return false;
// If 'O' wins, then count of X must be same as oCount
if (isWinner(board, 'O') && xCount != oCount)
return false;
return true;
}
return false;
}
// Driver program
int main()
{
char board[] = {'X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X'};
(isValid(board))? cout << "Given board is valid":
cout << "Given board is not valid";
return 0;
}
Java
import java.util.Arrays;
public class TicTacToe {
// Returns true if character 'c' wins. c can be either 'X' or 'O'
public static boolean isWinner(char[] board, char c) {
// Check all possible winning combinations
if ((board[0] == c && board[1] == c && board[2] == c) ||
(board[3] == c && board[4] == c && board[5] == c) ||
(board[6] == c && board[7] == c && board[8] == c) ||
(board[0] == c && board[3] == c && board[6] == c) ||
(board[1] == c && board[4] == c && board[7] == c) ||
(board[2] == c && board[5] == c && board[8] == c) ||
(board[0] == c && board[4] == c && board[8] == c) ||
(board[2] == c && board[4] == c && board[6] == c))
return true;
return false;
}
// Returns true if given board is valid, else returns false
public static boolean isValid(char[] board) {
// Count number of 'X' and 'O' in the given board
int xCount = 0, oCount = 0;
for (int i = 0; i < 9; i++) {
if (board[i] == 'X')
xCount++;
if (board[i] == 'O')
oCount++;
}
// Board can be valid only if either xCount and oCount is same or count is one more than oCount
if (xCount == oCount || xCount == oCount + 1) {
// Check if there is only one winner
if (isWinner(board, 'X') && isWinner(board, 'O'))
return false;
// If 'X' wins, then count of X must be greater
if (isWinner(board, 'X') && xCount != oCount + 1)
return false;
// If 'O' wins, then count of X must be same as oCount
if (isWinner(board, 'O') && xCount != oCount)
return false;
return true;
}
return false;
}
// Driver program
public static void main(String[] args) {
char[] board = {'X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X'};
if (isValid(board))
System.out.println("Given board is valid");
else
System.out.println("Given board is not valid");
}
}
Python3
# Python Program for the above approach
def isWinner(board, c):
# Check all possible winning combinations
if (board[0] == c and board[1] == c and board[2] == c) or \
(board[3] == c and board[4] == c and board[5] == c) or \
(board[6] == c and board[7] == c and board[8] == c) or \
(board[0] == c and board[3] == c and board[6] == c) or \
(board[1] == c and board[4] == c and board[7] == c) or \
(board[2] == c and board[5] == c and board[8] == c) or \
(board[0] == c and board[4] == c and board[8] == c) or \
(board[2] == c and board[4] == c and board[6] == c):
return True
return False
def isValid(board):
# Count number of 'X' and 'O' in the given board
xCount = 0
oCount = 0
for i in range(9):
if board[i] == 'X':
xCount += 1
if board[i] == 'O':
oCount += 1
# Board can be valid only if either xCount and oCount
# is same or count is one more than oCount
if xCount == oCount or xCount == oCount + 1:
# Check if there is only one winner
if isWinner(board, 'X') and isWinner(board, 'O'):
return False
# If 'X' wins, then count of X must be greater
if isWinner(board, 'X') and xCount != oCount + 1:
return False
# If 'O' wins, then count of X must be same as oCount
if isWinner(board, 'O') and xCount != oCount:
return False
return True
return False
# Driver program
board = ['X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X']
if isValid(board):
print("Given board is valid")
else:
print("Given board is not valid")
# THIS CODE IS CONTRIBUTED BY KIRTI AGARWAL
C#
using System;
public class TicTacToe {
// Returns true if character 'c' wins. c can be either 'X' or 'O'
public static bool IsWinner(char[] board, char c) {
// Check all possible winning combinations
if ((board[0] == c && board[1] == c && board[2] == c) ||
(board[3] == c && board[4] == c && board[5] == c) ||
(board[6] == c && board[7] == c && board[8] == c) ||
(board[0] == c && board[3] == c && board[6] == c) ||
(board[1] == c && board[4] == c && board[7] == c) ||
(board[2] == c && board[5] == c && board[8] == c) ||
(board[0] == c && board[4] == c && board[8] == c) ||
(board[2] == c && board[4] == c && board[6] == c))
return true;
return false;
}
// Returns true if given board is valid, else returns false
public static bool IsValid(char[] board) {
// Count number of 'X' and 'O' in the given board
int xCount = 0, oCount = 0;
for (int i = 0; i < 9; i++) {
if (board[i] == 'X')
xCount++;
if (board[i] == 'O')
oCount++;
}
// Board can be valid only if either xCount and oCount is same or count is one more than oCount
if (xCount == oCount || xCount == oCount + 1) {
// Check if there is only one winner
if (IsWinner(board, 'X') && IsWinner(board, 'O'))
return false;
// If 'X' wins, then count of X must be greater
if (IsWinner(board, 'X') && xCount != oCount + 1)
return false;
// If 'O' wins, then count of X must be same as oCount
if (IsWinner(board, 'O') && xCount != oCount)
return false;
return true;
}
return false;
}
// Driver program
public static void Main(string[] args) {
char[] board = { 'X', 'X', 'O',
'O', 'O', 'X',
'X', 'O', 'X' };
if (IsValid(board))
Console.WriteLine("Given board is valid");
else
Console.WriteLine("Given board is not valid");
}
}
JavaScript
// Returns true if character 'c' wins. c can be either 'X' or 'O'
function isWinner(board, c) {
// Check all possible winning combinations
if (
(board[0] === c && board[1] === c && board[2] === c) ||
(board[3] === c && board[4] === c && board[5] === c) ||
(board[6] === c && board[7] === c && board[8] === c) ||
(board[0] === c && board[3] === c && board[6] === c) ||
(board[1] === c && board[4] === c && board[7] === c) ||
(board[2] === c && board[5] === c && board[8] === c) ||
(board[0] === c && board[4] === c && board[8] === c) ||
(board[2] === c && board[4] === c && board[6] === c)
) {
return true;
}
return false;
}
// Returns true if given board is valid, else returns false
function isValid(board) {
// Count number of 'X' and 'O' in the given board
let xCount = 0;
let oCount = 0;
for (let i = 0; i < 9; i++) {
if (board[i] === 'X') xCount++;
if (board[i] === 'O') oCount++;
}
// Board can be valid only if either xCount and oCount
// is same or count is one more than oCount
if (xCount == oCount || xCount == oCount + 1) {
// Check if there is only one winner
if (isWinner(board, 'X') && isWinner(board, 'O')) {
return false;
}
// If 'X' wins, then count of X must be greater
if (isWinner(board, 'X') && xCount !== oCount + 1) {
return false;
}
// If 'O' wins, then count of X must be same as oCount
if (isWinner(board, 'O') && xCount !== oCount) {
return false;
}
return true;
}
return false;
}
// Driver program
const board = ['X', 'X', 'O', 'O', 'O', 'X', 'X', 'O', 'X'];
isValid(board) ? console.log('Given board is valid') : console.log('Given board is not valid');
OutputGiven board is valid
Time complexity: O(N^2)
Auxiliary Space: O(N)
Thanks to Utkarsh for suggesting this solution. This article is contributed by Aarti_Rathi and Utkarsh.
Similar Reads
Matrix Data Structure Matrix Data Structure is a two-dimensional array arranged in rows and columns. It is commonly used to represent mathematical matrices and is fundamental in various fields like mathematics, computer graphics, and data processing. Matrices allow for efficient storage and manipulation of data in a stru
2 min read
Matrix or Grid or 2D Array - Complete Tutorial Matrix or Grid is a two-dimensional array mostly used in mathematical and scientific calculations. It is also considered as an array of arrays, where array at each index has the same size. Representation of Matrix Data Structure:As you can see from the below image, the elements are organized in rows
11 min read
Row-wise vs column-wise traversal of matrix Two common ways of traversing a matrix are row-major-order and column-major-order Row Major Order: When matrix is accessed row by row. Column Major Order: When matrix is accessed column by column.Examples: Input : mat[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}Output : Row-wise: 1 2 3 4 5 6 7 8 9 Col-wi
6 min read
Applications of Matrices and Determinants Applications of Matrices and Determinants: One application of matrices and determinants is that they can be used to solve linear equations in two or three variables. Matrices and determinants are also used to check the consistency of any system, whether they are consistent or not. This is the most u
6 min read
Basic Operations on Matrix
Traverse a given Matrix using RecursionGiven a matrix mat[][] of size n x m, the task is to traverse this matrix using recursion.Examples: Input: mat[][] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]Output: 1 2 3 4 5 6 7 8 9Input: mat[][] = [[11, 12, 13], [14, 15, 16], [17, 18, 19]]Output: 11 12 13 14 15 16 17 18 19Approach: Check If the current p
5 min read
Rotate Matrix Clockwise by 1Given a square matrix, the task is to rotate its elements clockwise by one step.Examples:Input 1 2 34 5 6 7 8 9Output: 4 1 27 5 3 8 9 6Input: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 Output: 5 1 2 3 9 10 6 4 13 11 7 8 14 15 16 12The idea is to use nested loops to move elements in four directions (right
9 min read
Sort the given matrixGiven a m x n matrix. The problem is to sort the given matrix in strict order. Here strict order means that the matrix is sorted in a way such that all elements in a row are sorted in increasing order and for row âiâ, where 1 <= i <= m-1, the first element is greater than or equal to the last
5 min read
Search element in a sorted matrixGiven a sorted matrix mat[][] of size nxm and an element x, the task is to find if x is present in the matrix or not. Matrix is sorted in a way such that all elements in a row are sorted in increasing order and for row i, where 1 <= i <= n-1, the first element of row i is greater than or equal
13 min read
Program to find transpose of a matrixGiven a 2D matrix mat[][], the task is to compute its transpose. The transpose of a matrix is formed by converting all rows of mat[][] into columns and all columns into rows.Example:Input: [[7, 8], [9, 10], [11, 12]]Output: [[7, 9, 11], [8, 10, 12]]Explanation: The output is the transpose of the inp
8 min read
Adjoint and Inverse of a MatrixGiven a square matrix, find the adjoint and inverse of the matrix. We strongly recommend you to refer determinant of matrix as a prerequisite for this. Adjoint (or Adjugate) of a matrix is the matrix obtained by taking the transpose of the cofactor matrix of a given square matrix is called its Adjoi
15+ min read
Program to find Determinant of a MatrixThe determinant of a Matrix is defined as a special number that is defined only for square matrices (matrices that have the same number of rows and columns). A determinant is used in many places in calculus and other matrices related to algebra, it actually represents the matrix in terms of a real n
15+ min read
Easy problems on Matrix
Print matrix in zig-zag fashionGiven a matrix of 2D array of n rows and m columns. Print this matrix in ZIG-ZAG fashion as shown in figure. Example: Input: {{1, 2, 3}{4, 5, 6}{7, 8, 9}}Output: 1 2 4 7 5 3 6 8 9Input : [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]Output:: 1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16Thi
10 min read
Program for scalar multiplication of a matrixGiven a 2D matrix mat[][] with n rows and m columns and a scalar element k, the task is to find out the scalar product of the given matrix.Examples: Input: mat[][] = [[2, 3], [5, 4]]k = 5Output: [[10, 15], [25, 20]]Input:mat[][] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]k = 4Output: [[4, 8, 12], [16, 20, 2
4 min read
Print a given matrix in spiral formGiven a matrix mat[][] of size m x n, the task is to print all elements of the matrix in spiral form.Examples: Input: mat[][] = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]Output: [ 1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 ]Example of matrix in spiral formInput: mat[]
14 min read
Find distinct elements common to all rows of a matrixGiven a n x n matrix. The problem is to find all the distinct elements common to all rows of the matrix. The elements can be printed in any order. Examples: Input : mat[][] = { {2, 1, 4, 3}, {1, 2, 3, 2}, {3, 6, 2, 3}, {5, 2, 5, 3} } Output : 2 3 Input : mat[][] = { {12, 1, 14, 3, 16}, {14, 2, 1, 3,
15+ min read
Find unique elements in a matrixGiven a matrix mat[][] having n rows and m columns. The task is to find unique elements in the matrix i.e., those elements which are not repeated in the matrix or those elements whose frequency is 1. Examples: Input: mat[][] = [[2, 1, 4, 3], [1, 2, 3, 2], [3, 6, 2, 3], [5, 2, 5, 3]]Output: 4 6Input:
5 min read
Find maximum element of each row in a matrixGiven a matrix mat[][], the task is to find the maximum element of each row.Examples: Input: mat[][] = [[1, 2, 3] [1, 4, 9] [76, 34, 21]]Output :3976Input: mat[][] = [[1, 2, 3, 21] [12, 1, 65, 9] [1, 56, 34, 2]]Output :216556The idea is to run the loop for no_of_rows. Check each element inside the r
4 min read
Shift matrix elements row-wise by kGiven a square matrix mat[][] and a number k. The task is to shift the first k elements of each row to the right of the matrix. Examples : Input : mat[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} k = 2 Output :mat[N][N] = {{3, 1, 2} {6, 4, 5} {9, 7, 8}} Input : mat[N][N] = {{1, 2, 3, 4} {5, 6, 7, 8} {9
6 min read
Swap major and minor diagonals of a square matrixGiven a square matrix mat[][] of order n*n, the task is to swap the elements of major and minor diagonals.The major and minor diagonal matrix explanation is given below:Major Diagonal Elements of a Matrix: The Major Diagonal Elements are the ones that occur from the Top Left of the Matrix Down To th
6 min read
Squares of Matrix Diagonal ElementsGiven an integer matrix mat[][] of odd dimensions, the task is to find the square of the elements of the Primary and Secondary diagonals.The Primary and Secondary diagonal matrix explanation is given below:Primary Diagonal Elements of a Matrix: The Primary Diagonal Elements are the ones that occur f
11 min read
Sum of middle row and column in MatrixGiven an integer matrix of odd dimensions (3 * 3, 5 * 5). then the task is to find the sum of the middle row & column elements. Examples: Input : 2 5 7 3 7 2 5 6 9 Output : Sum of middle row = 12 Sum of middle column = 18 Input : 1 3 5 6 7 3 5 3 2 1 1 2 3 4 5 7 9 2 1 6 9 1 5 3 2 Output : Sum of
7 min read
Program to check idempotent matrixGiven a square matrix mat[][] of order n*n, the task is to check if it is an Idempotent Matrix or not.Idempotent matrix: A matrix is said to be an idempotent matrix if the matrix multiplied by itself returns the same matrix, i.e. the matrix mat[][] is said to be an idempotent matrix if and only if M
5 min read
Program to check diagonal matrix and scalar matrixGiven a square matrix mat[][] of order n*n, the task is to check if it is a Diagonal Matrix and Scalar matrix.Diagonal Matrix: A square matrix is said to be a diagonal matrix if the elements of the matrix except the main diagonal are zero. A square null matrix is also a diagonal matrix whose main di
9 min read
Program to check Identity MatrixGiven a square matrix mat[][] of order n*n, the task is to check if it is an Identity Matrix.Identity Matrix: A square matrix is said to be an identity matrix if the elements of main diagonal are one and all other elements are zero. The identity Matrix is also known as the Unit Matrix. Examples: Inp
5 min read
Mirror of matrix across diagonalGiven a 2-D array of order N x N, print a matrix that is the mirror of the given tree across the diagonal. We need to print the result in a way: swap the values of the triangle above the diagonal with the values of the triangle below it like a mirror image swap. Print the 2-D array obtained in a mat
14 min read
Program for addition of two matricesGiven two N x M matrices. Find a N x M matrix as the sum of given matrices each value at the sum of values of corresponding elements of the given two matrices. Approach: Below is the idea to solve the problem.Iterate over every cell of matrix (i, j), add the corresponding values of the two matrices
5 min read
Program for subtraction of matricesGiven two m x n matrices m1 and m2, the task is to subtract m2 from m1 and return res.Input: m1 = {{1, 2}, {3, 4}}, m2 = {{4, 3}, {2, 1}}Output: {{-3, -1}, {1, 3}}Input: m1 = {{3, 3, 3}, {3, 3, 3}}, m1 = {{2, 2, 2}, {1, 1, 1}},Output: {{1, 1, 1}, {2, 2, 2}},We traverse both matrices element by eleme
5 min read
Intermediate problems on Matrix
Program for Conway's Game Of Life | Set 1Given a Binary Matrix mat[][] of order m*n. A cell with a value of zero is a Dead Cell, while a cell with a value of one is a Live Cell. The state of cells in a matrix mat[][] is known as Generation. The task is to find the next generation of cells based on the following rules:Any live cell with few
12 min read
Program to multiply two matricesGiven two matrices, the task is to multiply them. Matrices can either be square or rectangular:Examples: (Square Matrix Multiplication)Input: m1[m][n] = { {1, 1}, {2, 2} }m2[n][p] = { {1, 1}, {2, 2} }Output: res[m][p] = { {3, 3}, {6, 6} }(Rectangular Matrix Multiplication)Input: m1[3][2] = { {1, 1},
7 min read
Rotate an Image 90 Degree CounterclockwiseGiven an image represented by m x n matrix, rotate the image by 90 degrees in counterclockwise direction. Please note the dimensions of the result matrix are going to n x m for an m x n input matrix.Input: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Output: 4 8 12 16 3 7 11 15 2 6 10 14 1 5 9 13Input: 1
6 min read
Check if all rows of a matrix are circular rotations of each otherGiven a matrix of n*n size, the task is to find whether all rows are circular rotations of each other or not. Examples: Input: mat[][] = 1, 2, 3 3, 1, 2 2, 3, 1 Output: Yes All rows are rotated permutation of each other. Input: mat[3][3] = 1, 2, 3 3, 2, 1 1, 3, 2 Output: No Explanation : As 3, 2, 1
8 min read
Largest Cross Bordered SquareGiven a matrix mat[][] of size n x n where every element is either 'O' or 'X', the task is to find the size of the largest square subgrid that is completely surrounded by 'X', i.e. the largest square where all its border cells are 'X'. Examples: Input: mat[][] = [ ['X', 'X'], ['X', 'X'] ]Output: 2Ex
15 min read
Count zeros in a row wise and column wise sorted matrixGiven a n x n binary matrix (elements in matrix can be either 1 or 0) where each row and column of the matrix is sorted in ascending order, count number of 0s present in it.Examples: Input: [0, 0, 0, 0, 1][0, 0, 0, 1, 1][0, 1, 1, 1, 1][1, 1, 1, 1, 1][1, 1, 1, 1, 1]Output: 8Input: [0, 0][0, 0]Output:
6 min read
Queries in a MatrixGiven two integers m and n, that describes the order m*n of a matrix mat[][], initially filled with integers from 1 to m*n sequentially in a row-major order. Also, there is a 2d array query[][] consisting of q queries, which contains three integers each, where the first integer t describes the type
15 min read
Find pairs with given sum such that elements of pair are in different rowsGiven a matrix of distinct values and a sum. The task is to find all the pairs in a given matrix whose summation is equal to the given sum. Each element of a pair must be from different rows i.e; the pair must not lie in the same row.Examples: Input : mat[][] = {{1, 3, 2, 4}, {5, 8, 7, 6}, {9, 10, 1
15+ min read
Find all permuted rows of a given row in a matrixGiven a matrix mat[][] of order m*n, and an index ind. The task is to find all the rows in the matrix mat[][] which are permutations of rows at index ind.Note: All the elements of a row are distinct.Examples: Input: mat[][] = [[3, 1, 4, 2], [1, 6, 9, 3], [1, 2, 3, 4], [4, 3, 2, 1]] ind = 3 Output: 0
9 min read
Find number of transformation to make two Matrix EqualGiven two matrices a and b of size n*m. The task is to find the required number of transformation steps so that both matrices become equal. Print -1 if this is not possible. The transformation step is as follows: Select any one matrix out of two matrices. Choose either row/column of the selected mat
8 min read
Inplace (Fixed space) M x N size matrix transposeGiven an M x N matrix, transpose the matrix without auxiliary memory.It is easy to transpose matrix using an auxiliary array. If the matrix is symmetric in size, we can transpose the matrix inplace by mirroring the 2D array across it's diagonal (try yourself). How to transpose an arbitrary size matr
15+ min read
Minimum flip required to make Binary Matrix symmetricGiven a Binary Matrix mat[][] of size n x n, consisting of 1s and 0s. The task is to find the minimum flips required to make the matrix symmetric along the main diagonal.Examples : Input: mat[][] = [[0, 0, 1], [1, 1, 1], [1, 0, 0]];Output: 2Value of mat[1][0] is not equal to mat[0][1].Value of mat[2
8 min read
Magic Square of Odd OrderGiven a positive integer n, your task is to generate a magic square of order n * n. A magic square of order n is an nâ¯*â¯n grid filled with the numbers 1 through n² so that every row, every column, and both main diagonals each add up to the same total, called the magic constant (or magic sum) M. Beca
15+ min read
Hard problems on Matrix
Number of IslandsGiven an n x m grid of 'W' (Water) and 'L' (Land), the task is to count the number of islands. An island is a group of adjacent 'L' cells connected horizontally, vertically, or diagonally, and it is surrounded by water or the grid boundary. The goal is to determine how many distinct islands exist in
15+ min read
A Boolean Matrix QuestionGiven a boolean matrix mat where each cell contains either 0 or 1, the task is to modify it such that if a matrix cell matrix[i][j] is 1 then all the cells in its ith row and jth column will become 1.Examples:Input: [[1, 0], [0, 0]]Output: [[1, 1], [1, 0]]Input: [[1, 0, 0, 1], [0, 0, 1, 0], [0, 0, 0
15+ min read
Matrix Chain MultiplicationGiven the dimension of a sequence of matrices in an array arr[], where the dimension of the ith matrix is (arr[i-1] * arr[i]), the task is to find the most efficient way to multiply these matrices together such that the total number of element multiplications is minimum. When two matrices of size m*
15+ min read
Maximum size rectangle binary sub-matrix with all 1sGiven a 2d binary matrix mat[][], the task is to find the maximum size rectangle binary-sub-matrix with all 1's. Examples: Input: mat = [ [0, 1, 1, 0], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 0, 0] ]Output : 8Explanation : The largest rectangle with only 1's is from (1, 0) to (2, 3) which is[1, 1, 1, 1][
15 min read
Construct Ancestor Matrix from a Given Binary TreeGiven a Binary Tree where all values are from 0 to n-1. Construct an ancestor matrix mat[n][n] where the ancestor matrix is defined as below. mat[i][j] = 1 if i is ancestor of jmat[i][j] = 0, otherwiseExamples: Input: Output: {{0 1 1} {0 0 0} {0 0 0}}Input: Output: {{0 0 0 0 0 0} {1 0 0 0 1 0} {0 0
15+ min read
K'th element in spiral form of matrixGiven a matrix of size n * m. You have to find the kth element which will obtain while traversing the matrix spirally starting from the top-left corner of the matrix.Examples:Input: mat[][] = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ], k = 4Output: 6Explanation: Spiral traversal of matrix: {1, 2, 3, 6, 9,
13 min read
Largest Plus or '+' formed by all ones in a binary square matrixGiven an n à n binary matrix mat consisting of 0s and 1s. Your task is to find the size of the largest â+â shape that can be formed using only 1s. A â+â shape consists of a center cell with four arms extending in all four directions (up, down, left, and right) while remaining within the matrix bound
10 min read
Shortest path in a Binary MazeGiven an M x N matrix where each element can either be 0 or 1. We need to find the shortest path between a given source cell to a destination cell. The path can only be created out of a cell if its value is 1.Note: You can move into an adjacent cell in one of the four directions, Up, Down, Left, and
15+ min read
Maximum sum square sub-matrix of given sizeGiven a 2d array mat[][] of order n * n, and an integer k. Your task is to find a submatrix of order k * k, such that sum of all the elements in the submatrix is maximum possible.Note: Matrix mat[][] contains zero, positive and negative integers.Examples:Input: k = 3mat[][] = [ [ 1, 2, -1, 4 ] [ -8,
15+ min read
Validity of a given Tic-Tac-Toe board configurationA Tic-Tac-Toe board is given after some moves are played. Find out if the given board is valid, i.e., is it possible to reach this board position after some moves or not.Note that every arbitrary filled grid of 9 spaces isn't valid e.g. a grid filled with 3 X and 6 O isn't valid situation because ea
15+ min read
Minimum Initial Points to Reach DestinationGiven a m*n grid with each cell consisting of positive, negative, or no points i.e., zero points. From a cell (i, j) we can move to (i+1, j) or (i, j+1) and we can move to a cell only if we have positive points ( > 0 ) when we move to that cell. Whenever we pass through a cell, points in that cel
15+ min read
Program for Sudoku GeneratorGiven an integer k, the task is to generate a 9 x 9 Sudoku grid having k empty cells while following the below set of rules:In all 9 submatrices 3x3, the elements should be 1-9, without repetition.In all rows, there should be elements between 1-9, without repetition.In all columns, there should be e
15+ min read