Hackety Hacking Problem Chess puzzle

From OLPC
Revision as of 21:40, 22 January 2008 by Anubhavit (talk | contribs) (New page: == Problem Statement == CHESS PUZZLE My friend who is very good at chess bets me (not so good at chess ) to solve a classical puzzle of positioning eight queens on an 8*8 chessboard such ...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Problem Statement

CHESS PUZZLE

My friend who is very good at chess bets me (not so good at chess ) to solve a classical puzzle of positioning eight queens on an 8*8 chessboard such that no two queens threaten each other. This means that no two queens may lie on the same row, column or diagonal.Please help me as I cannot do this on my own.

HINT : You have to write a program to print a chessboard positioning 8 queens according to the puzzle. Use backtracking technique and then check each case that does it satisfy the requirement.

Sample Output


1 * * * * * * *
* * * * 1 * * *
* * * * * * * 1
* * * * * 1 * *
* * 1 * * * * *
* * * * * * 1 *
* 1 * * * * * *
* * * 1 * * * *

Curriculum Connections

This problem gives student help in understanding few thins mentioned below:

  • Making use of an important tool to develop Advanced programs - Backtracking technique
  • Making use of structures

Solution

 

This program is written in C++.
Compiled using Borland 5.5 C++ compiler.

#include<stdio.h>
#include<conio.h>
#include<process.h>
/* This is the structure used to save the status of every block of chess if it is affected by the queen or not 
*/
struct b
{
int p;
int hit;
};

typedef struct b node;

/* This function traverse every possible status of the chess with 8 queens on it.
    And then searches for a status that satisfies the given condition. 
    Using nested for and if loops.
*/
void reset(node a[8][8])
{
int i , j , k , l;
for(i=0;i<8 ;i++)
		for(j=0;j<8;j++)
			a[i][j].hit=0;
for(i=0;i<8;i++)
		for(j=0;j<8;j++)
		{
			if(a[i][j].p==1)
			{
				for(k=0;k<8;k++)
					for(l=0;l<8;l++)
					{
						if((i-j)==(k-l))
							a[k][l].hit=1;
						if((i+j)==(k+l))
							a[k][l].hit=1;
						if(k==i)
							a[k][l].hit=1;
						if(l==j)
							a[k][l].hit=1;
					}

			}
		}
};

/* This function prints the chessboard once the solution of the puzzle is found 
This uses two nested for loop to print the chess board using ‘*’ for an empty position and ‘1’ for a queen.
*/
void print(node a[8][8])
{
int i, j;
for(i=0;i<8;i++)
{
		for(j=0;j<8;j++)
		{
			if(a[i][j].p==1)
				printf("1 ");
			else
				printf("* ");
		}
printf("\n");
}
getch();
};

void solve(node a[8][8], int count)
{
int i,j;
if(count==8)
	{
		print(a);
		exit(0);
	}
else
{
		for(i=0;i<8;i++)
			for(j=0;j<8;j++)
			{
				if((a[i][j].p==0)&&(a[i][j].hit==0))
				{
					a[i][j].p=1;
					reset(a);
					solve(a,count+1);
					a[i][j].p=0;
					reset(a);
				}

			}
}
};
/* Small main code to call the function that is created */
int main()
{
int i, j;
clrscr();
struct b c[8][8];
for(i=0;i<8;i++)
	for(j=0;j<8;j++)
	{
		c[i][j].p=0;
		c[i][j].hit=0;
	}
solve(c,0);
return 0;
}