Last active
February 26, 2019 16:48
-
-
Save Codeplaza/7559802 to your computer and use it in GitHub Desktop.
8 Queen Program
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| #include <conio.h> | |
| #include <graphics.h> | |
| #define SAFE 1 | |
| #define NOT_SAFE 0 | |
| #define TRUE 1 | |
| #define FALSE 0 | |
| //this is the array i used to keep track of my queens | |
| int queen[8] = {-1,-1,-1,-1,-1,-1,-1,-1}; | |
| int solution = 0; | |
| FILE *fp; | |
| //this function will draw the chess board using graphics | |
| void drawSathurangam() { | |
| int ctr1, ctr2; | |
| for( ctr1 = 0 ; ctr1 < 8 ; ctr1++ ) { | |
| for( ctr2 = 0 ; ctr2 < 8 ; ctr2++ ) { | |
| if( ( ctr1 + ctr2 ) % 2 == 0 ) | |
| setfillstyle( SOLID_FILL, WHITE ); | |
| else | |
| setfillstyle( SOLID_FILL, BLACK ); | |
| bar(120 + ( ctr2 * 50 ),40 + ( ctr1 * 50 ),170 + ( ctr2 * 50 ),90 + ( ctr1 * 50 )); | |
| } | |
| } | |
| rectangle( 120, 40, 120 + ( 50 * 8 ), 40 + ( 50 * 8 ) ); | |
| } | |
| //each time when i update array, this function will be called | |
| void placeQueenAndUpdate( int row, int col ) { | |
| queen[ row ] = col; | |
| if( ( row + col ) % 2 == 0 ) | |
| setcolor( BLACK ); | |
| else | |
| setcolor( WHITE ); | |
| settextstyle( 4, 0, 3 ); | |
| outtextxy( 135 + ( col * 50 ), 50 + ( row * 50 ), "Q" ); | |
| } | |
| //this will check whether the given box in the chess board is free or not | |
| int isFree( int row, int col ) { | |
| if( queen[ row ] == col ) | |
| return FALSE; | |
| else | |
| return TRUE; | |
| } | |
| //this function will tell whether the calculated row, col value exits or not | |
| int isAvailable( int row, int col ) { | |
| if( row == 7 && col == 8 ) { | |
| closegraph(); | |
| clrscr(); | |
| getch(); | |
| exit(1); | |
| } | |
| if( row > -1 && row < 8 && col > -1 && col < 8 ) | |
| return TRUE; | |
| else | |
| return FALSE; | |
| } | |
| //this function will check the entire left diagonal elements | |
| int checkLeftDiagonal( int row, int col ) { | |
| int r, c; | |
| r = row - 1; | |
| c = col - 1; | |
| while ( isAvailable( r, c ) == TRUE ) { | |
| if( isFree( r, c ) == TRUE ) { | |
| r--; | |
| c--; | |
| } else { | |
| return NOT_SAFE; | |
| } | |
| } | |
| return SAFE; | |
| } | |
| //this function will check the entire top elements in the same column | |
| int checkTop( int row, int col ) { | |
| int r, c; | |
| r = row - 1; | |
| c = col; | |
| while ( isAvailable( r, c ) == TRUE ) { | |
| if( isFree( r, c ) == TRUE ) { | |
| r--; | |
| } else { | |
| return NOT_SAFE; | |
| } | |
| } | |
| return SAFE; | |
| } | |
| //this function will check the entire right diagonal elements | |
| int checkRightDiagonal( int row, int col ) { | |
| int r, c; | |
| r = row - 1; | |
| c = col + 1; | |
| while ( isAvailable( r, c ) == TRUE ) { | |
| if( isFree( r, c ) == TRUE ) { | |
| r--; | |
| c++; | |
| } else { | |
| return NOT_SAFE; | |
| } | |
| } | |
| return SAFE; | |
| } | |
| //this function will tell whether the given box is free to place the queen | |
| //or not | |
| int isSafe( int row, int col ) { | |
| if( checkLeftDiagonal( row, col) == SAFE ) { | |
| if( checkTop( row, col ) == SAFE ) { | |
| if( checkRightDiagonal( row, col ) == SAFE ) { | |
| return SAFE; | |
| } else { | |
| return NOT_SAFE; | |
| } | |
| } else { | |
| return NOT_SAFE; | |
| } | |
| } else { | |
| return NOT_SAFE; | |
| } | |
| } | |
| //this function will erase the queen and it will update the array | |
| //this will happen when backtracking | |
| void eraseQueenAndUpdate( int row, int col ) { | |
| if( ( row + col ) % 2 == 0 ) | |
| setfillstyle( SOLID_FILL, WHITE ); | |
| else | |
| setfillstyle( SOLID_FILL, BLACK ); | |
| bar( 120 + ( col * 50 ), 40 + ( row * 50 ) , ( 120 + ( col * 50 ) ) + 50, ( 40 + ( row * 50 ) ) + 50 ); | |
| setcolor( WHITE ); | |
| rectangle( 120 + ( col * 50 ), 40 + ( row * 50 ) , ( 120 + ( col * 50 ) ) + 50, ( 40 + ( row * 50 ) ) + 50 ); | |
| queen[ row ] = -1; | |
| } | |
| //if we dont get any place for the queen, then we have to backtrack to get | |
| //another combination | |
| void backtrack( int *row, int *col ) { | |
| (*row)--; | |
| *col = queen[ *row ] + 1; | |
| eraseQueenAndUpdate( *row, (*col) - 1 ); | |
| if( *row == 7 && *col == 8 ) { | |
| backtrack( row, col ); | |
| } | |
| } | |
| //this function will fill the queens | |
| void play() { | |
| int row = 0, col = 0; | |
| placeQueenAndUpdate( row, col ); | |
| row++; | |
| while( row < 8 ) { | |
| while( col < 8 ) { | |
| if( isAvailable( row, col ) == TRUE ) { | |
| if( isSafe( row, col ) == SAFE ) { | |
| placeQueenAndUpdate( row, col ); | |
| row++; | |
| col = 0; | |
| } | |
| else | |
| col++; | |
| while( col == 8 ) { //backtracking | |
| backtrack( &row, &col ); | |
| } | |
| if(row == 8 ) { | |
| delay(100); | |
| solution++; | |
| fprintf(fp,"%d %d %d %d %d %d %d %d\n", queen[0], queen[1], queen[2], queen[3], queen[4], queen[5], queen[6], queen[7]); | |
| if( solution == 92 ) { | |
| getch(); | |
| closegraph(); | |
| fclose(fp); | |
| exit(1); | |
| } | |
| } | |
| } | |
| else { | |
| backtrack( &row, &col ); | |
| } | |
| } | |
| } | |
| } | |
| //this is the main function ;) | |
| void main() { | |
| int gdriver = DETECT, gmode; | |
| initgraph( &gdriver, &gmode, "c:\\turboc3\\bgi" ); | |
| drawSathurangam(); | |
| play(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment