0

我已经为 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;

}
4

1 回答 1

3

部分完成后,您应该从queen函数返回。i==8目前你继续,最后你arr[i][j]=0;i==7and执行j==8。这是数组末尾的一个,并且count紧随其后驻留arr在内存中,它被重置为零。

发现使用gdb:增加计数后中断,在计数上设置(硬件)观察点,并继续查看计数再次更改值的位置。

于 2012-09-09T00:29:52.407 回答