- Back to Home »
- Queen (C with Graphics)
Posted by : Unknown
#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(); }