递归时不寻常的概率(8个皇后概率)

时间:2012-09-08 19:45:22

标签: c++ recursion

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

}

1 个答案:

答案 0 :(得分:3)

queen部分完成后,您应该从i==8函数返回。目前您继续,最后使用arr[i][j]=0;i==7执行j==8。这是数组末尾的一个,并且count在内存中arr之后立即停留,它将重置为零。

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