c++ - 递归中的异常概率(8 皇后概率)

标签 c++ recursion

<分区>

我已经为 8 皇后问题编写了一个程序。它打印出所有可能的解决方案。

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;

}

最佳答案

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

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

关于c++ - 递归中的异常概率(8 皇后概率),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333911/

相关文章:

javascript - 为什么 v8::JSON::Parse 从 v8 比 NodeJS JSON::parse 慢得多?

c++ - 循环的编译器优化

Java 列表/递归错误

c++ - (C++) 为相等元素的快速排序添加随机性

c++ - 对 `_imp__apr_getopt_init@16' 的 undefined reference

go - 为什么我的 map 合并功能会合并所有内容?

java - 递归 ORM 类的 Spring Repository 性能问题

algorithm - 将 Big-O 递归算法简化为线性

java - 为什么我的递归迷宫算法不回溯?

c++ - 这个 boost::asio 和 boost::coroutine 使用模式有什么问题?