Today I m posting solution developed by me for this coding challenge. Got Crazy with the Backtracking Algorithm.
PROBLEM STATEMENT:
You are given a 10X10 chessboard with a knight on coordinate (I,J). You have to find the number of blocks on the chessboard that the knight can be at in exactly N moves.
NOTE:
The knight can move from its position in the diagram to all the coordinates marked by X
in the following diagram in one move. For the 10X10 chessboard (1,1) is the top-left corner,(1,10) is the top-right corner and (10,10) is the bottom-right corner.
INPUT :
Input will consist of three space separated integers I
,J,N
N is less than 10.
OUTPUT:
Print a single integer denoting the number of blocks on the chessboard that the knight can be at in exactly N
moves.
Sample Input: 3 3 1
Sample Output: 8
My Code in C solving this Problem:
PROBLEM STATEMENT:
You are given a 10X10 chessboard with a knight on coordinate (I,J). You have to find the number of blocks on the chessboard that the knight can be at in exactly N moves.
NOTE:
The knight can move from its position in the diagram to all the coordinates marked by X
in the following diagram in one move. For the 10X10 chessboard (1,1) is the top-left corner,(1,10) is the top-right corner and (10,10) is the bottom-right corner.
INPUT :
Input will consist of three space separated integers I
,J,N
N is less than 10.
OUTPUT:
Print a single integer denoting the number of blocks on the chessboard that the knight can be at in exactly N
moves.
Sample Input: 3 3 1
Sample Output: 8
My Code in C solving this Problem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | /* Problem : A Tryst with Chess Author : Pavan Yekabote */ #include<stdio.h> struct mve{ int x,y; }; typedef struct mve Moves; Moves getMoveFrom(int x,int y){ Moves mv; mv.x = x; mv.y = y; return mv; } void fillBoard(int board[][11]) { int i,j; for(i=0; i< 10; i++) { for(j=0; j<10; j++) board[i][j] = 0; } } int countOnes(int board[][11]) { int i,j,c=0; for(i=0; i< 10; i++) { for(j=0; j<10; j++) if(board[i][j] == 1) c++; } return c; } void placeMove(Moves move, int board[][11]) { board[move.x][move.y] = 1; } void displayBoard(int board[][11]) { int i,j; for(i=0; i< 10; i++) { for(j=0; j<10; j++) printf("%d ",board[i][j]); printf("\n"); } } int getPossibleMoves(int x, int y, int boardSize, int* sizeOfPossibleMoves, Moves nPossibleMoves[]) { int x1[8] = {-1, -2, 1, 2, -1, -2, 1, 2},y1[8] = {-2, -1, -2, -1, 2, 1, 2, 1},i,j,x2,y2; for(i=0,j=0; i< 8; i++) { x2 = x+x1[i]; y2 = y+y1[i]; if( x2 >= 0 && x2 < boardSize && y2 >= 0 && y2 < boardSize ) nPossibleMoves[j++] = getMoveFrom(x2,y2); } *sizeOfPossibleMoves = j; } int getNMovesOfKnight(int board[][11],Moves placedCoord, int n, int nthMove, int nMoves) { int i,j, nPossMoves, ko,c=0; Moves moves[9]; if(nthMove >= nMoves) return 0; getPossibleMoves( placedCoord.x, placedCoord.y, 10, &nPossMoves, moves); for(j=0; j<nPossMoves; j++ ) { if(!(getNMovesOfKnight(board, moves[j], n, nthMove+1, nMoves))) placeMove(moves[j],board); else { board[moves[j].x][moves[j].y] = 0; c++; } } return nPossMoves-c; } int main() { int board[11][11]; int x,y, nMoves; Moves move; int i,j,n=10; scanf("%d%d%d",&x,&y,&nMoves); move.x = x-1; move.y = y-1; fillBoard(board); x = getNMovesOfKnight(board,move,n,0,nMoves); printf("%d",countOnes(board)); } |
No comments:
Post a Comment