我已经为8-Queens问题编写了一个程序。它会打印所有可能的解决方案。
queens()找到所有可能的解决方案。 ok()告诉给定的列和行是否安全。
非常奇怪的问题是:
'计数'不会增加。我不明白为什么。
#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;
}
答案 0 :(得分:3)
queen
部分完成后,您应该从i==8
函数返回。目前您继续,最后使用arr[i][j]=0;
和i==7
执行j==8
。这是数组末尾的一个,并且count
在内存中arr
之后立即停留,它将重置为零。
使用gdb
找到:递增计数后中断,在计数时设置(硬件)观察点,并继续查看计数再次更改值的位置。