I have written a program for the 8-Queens problem.It prints all possible solutions.
queens() finds all the possible solutions.
ok() tells whether the given column and row is safe or not.
The very strange problem is:
‘Count’ won’t increment. I have no idea why.
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
int arr[8][8]={0};
int count=0;
int ok(int k,int j)
{
int i,l;
int tup[8]={0};
for(i=0;i<k;i++)
{
for(l=0;l<8;l++)
{
if(arr[i][l]==1)
tup[i]=l;
}
}
for(i=0;i<k;i++)
{
if((abs(tup[i]-j)==abs(i-k))||(tup[i]==j)||(arr[i][j]==1))
return 0;
}
return 1;
}
void queen(int i)
{
int j,k,temp;
if(i==8)
{
count++;
cout<<"Solution no. "<<count<<":\n";
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(arr[i][j]==1)
cout<<"Q";
else
cout<<"=";
cout<<" ";
}
cout<<"\n";
}
cout<<"---------------\n";
getch();
}
for(j=0;j<8;j++)
{
if(ok(i,j))
{
for(k=0;k<8;k++)
arr[i][k]=0;
arr[i][j]=1;
queen(i+1);
}
}
arr[i][j]=0;
}
int main()
{
clrscr();
queen(0);
return 0;
}
You should return from the
queenfunction after thei==8part is done. Currently you continue, and at the end you executearr[i][j]=0;withi==7andj==8. This is one past the end of the array, and ascountresides immediately afterarrin memory, it gets reset to zero.Found using
gdb: Break after incrementing count, set (hardware) watchpoint on count, and continue to see where count changes value again.