Problem : Knight Moves
A
Chess board position is accurately captured by Forsyth-Edwards notation
and is abbreviated as FEN. A FEN "record" defines a particular game
position, all in one text line and using only the ASCII character set. A
FEN record contains six fields. A complete description of the FEN
format to represent Chess positions can be found at
here
For
the purpose of this problem only consider first of the six fields of
FEN. Before we describe the problem, let us look at how FEN maps to a
board position. The following 5 images show board positions and its
corresponding FEN representation.
Figure 1.
This
board position depicts initial position before any side has made a
move. In FEN format this board position is represented as
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w |
Let's say, White plays e4. Then the board position looks like shown below
Figure 2.
This board position depicts the Chess board after White has played e4. In FEN format this board position is represented as
rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b |
Similarly, 3 more half-moves are depicted in following diagrams
Figure 3. Figure 4. Figure 5.
The FENs corresponding to Figure 3, 4 and 5 are represented as
3. rnbqkbnr/pppp1ppp/8/4P3/4P3/8/PPPP1PPP/RNBQKBNR w
4. rnbqkbnr/pppp1ppp/8/4p3/4PP2/8/PPPP2PP/RNBQKBNR b
5. rnbqkbnr/pppp1ppp/8/8/4Pp2/8/PPPP2PP/RNBQKBNR w
Wikipedia describes first field of FEN format as follows
Each
rank is described, starting with rank 8 and ending with rank 1; within
each rank, the contents of each square are described from file "a"
through file "h". Following the Standard Algebraic Notation(SAN),
each piece is identified by a single letter taken from the standard
English names (pawn = "P", knight = "N", bishop = "B", rook = "R", queen
= "Q" and king = "K").[1] White pieces are designated using upper-case
letters ("PNBRQK") while black pieces use lowercase ("pnbrqk"). Empty
squares are noted using digits 1 through 8 (the number of empty
squares), and "/" separates ranks.
The
second field denotes whose move it is now. "w" depicts that it is
White's turn to play and "b" indicates that it is Black's turn to play
CodeVita Problem Statement
Given a board position in FEN format, your task is to find out all the move(s) that Knight(s) of the playing side can make.
Input Format:
- First line contains single FEN record, which corresponds to a particular board position and also indicates whose turn it is.
Output Format:
- The output must be printed as follows
- All legal moves that Knight can make must be in the format "[<Move Format>]"
- Where <Move Format> is move represented in format "[fromSquare][toSquare]"
- See Example section for better understanding of output format
- Follow Output printing specification to print the output in required format
Sample Input and Output
SNO. | INPUT | BOARD DEPICTION | OUTPUT |
1 |
3k4/8/8/8/8/1K4R1/5R2/7N w |
 |
[] |
2 |
3k4/8/8/8/8/6b1/5r2/K6N w |
 |
[h1g3, h1f2] |
3 |
2k1b3/6n1/n7/5R2/8/8/8/4K3 b |
 |
[g7e6, g7f5, g7h5, a6b8, a6c7, a6c5, a6b4] |
- Should start with "[" and end with "]"
- If more than one move is possible, moves should be separated by a comma followed by whitespace
- Moves of a single bishop should be printed in Move Format. Scan the board from 8th rank to 1strank from a-file to h-file. Whichever square gets hit first, that move should be printed first.
- If more than one bishop exists for side to move, then start scanning for bishop from 8th rank to 1st rank, left to right i.e. from a-file to h-file. Whichever bishop appears first, print all moves for that bishop first.
- Verify your understanding of how printing should happen against examples shown above
SOLUTION
Please read notes
Thanks for visting.I'll soon update explition video
You can get board to string at -here don't forget to add w/b for turn
for download of source code mega link
/******************************************************KINGHT MOVE SOLUTION************************************************/
/*
Notes:-
1. it check KINGHT MOVE only
2. it not check correctness of fen inputr it assume that input string is correct (worng string also give worng ouput)
3. it not care about kings in board it also work if one knight pressent in board which is worng according to chess rules
*/
#include<iostream>
using namespace std;//you can't use namespace in codevita so you can replace cout with std::cout as similler to cin
bool move_index_checker(int,int);
bool move_checker(int,int);
void moves(int,int);
string ip;//for fen input
char Board[9][9]= // for storing chess board in matrix it. it store it in 1 to 8 index o index is empty
{{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' '}},ch;//ch for storing turn of player
int count=1,i=1,j=1;
unsigned int a=0;
int main()
{
cout<<"Enter string=\n";
getline(cin,ip);//ip store the fen string
cout<<ip;
while(count<=64)//
{
//cout<<"ip["<<a<<"]="<<ip[a];
if(ip[a]=='r'||ip[a]=='n'||ip[a]=='b'||ip[a]=='q'||ip[a]=='k'||ip[a]=='p'||ip[a]=='R'||ip[a]=='N'||ip[a]=='B'||ip[a]=='Q'||ip[a]=='K'||ip[a]=='P')
{
Board[i][j]=ip[a];
j++; count++;
}
else if(ip[a]=='/')
{
i++; j=1;
}
else
{
j+=(int)ip[a]-48;
//cout<<(int)ip[a]-48<<endl;
count+=(int)ip[a]-48;
}
a++;
}
(ip[a+1]=='w')? ch='N':ch='n';
cout<<ch<<endl<<endl;
int x[3]={1,0,0},y[3]={0,0,0};
for(i=1;i<9;i++)
{
for(j=1;j<9;j++)
{
if(Board[i][j]==ch)
{
x[x[0]]=i;y[x[0]]=j;
x[0]+=1;
}
}
}
cout<<'[';
if(x[1]!=0&&y[1]!=0)
{
moves(x[1],y[1]);
}
if(x[2]!=0&&y[2]!=0)
{
moves(x[2],y[2]);
}
cout <<']';
cout<<endl<<endl;
}
bool move_index_checker(int v,int h)
{
if((v>0&&v<9)&&(h>0&&h<9))
return true;
return false;
}
bool move_checker(int v,int h)
{
if(ch=='N')
{
if(Board[v][h]=='R'||Board[v][h]=='N'||Board[v][h]=='B'||Board[v][h]=='Q'||Board[v][h]=='K'||Board[v][h]=='P')
return false;
}
else
{
if(Board[v][h]=='r'||Board[v][h]=='n'||Board[v][h]=='b'||Board[v][h]=='q'||Board[v][h]=='k'||Board[v][h]=='p')
return false;
}
return true;
}
void moves(int v,int h)
{
if(move_index_checker(v-2,h+1)&&move_checker(v-2,h+1))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96+1)<<9-(v-2)<<',';
}
if(move_index_checker(v-2,h-1)&&move_checker(v-2,h-1))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96-1)<<9-(v-2)<<',';
}
if(move_index_checker(v+2,h+1)&&move_checker(v+2,h+1))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96+1)<<9-(v+2)<<',';
}
if(move_index_checker(v+2,h-1)&&move_checker(v+2,h-1))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96-1)<<9-(v+2)<<',';
}
if(move_index_checker(v-1,h+2)&&move_checker(v-1,h+2))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96+2)<<9-(v-1)<<',';
}
if(move_index_checker(v-1,h-2)&&move_checker(v-1,h-2))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96-2)<<9-(v-1)<<',';
}
if(move_index_checker(v+1,h+2)&&move_checker(v+1,h+2))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96+2)<<9-(v+1)<<',';
}
if(move_index_checker(v+1,h-2)&&move_checker(v+1,h-2))
{
cout<<static_cast<char>(h+96)<<9-v<<static_cast<char>(h+96-2)<<9-(v+1)<<',';
}
}
PartyLesh