#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
int count1=0,i,j,k,m,n;
bool hasha[1000]={false};
int p[1000];
void getp(int index)
{
if(index==n+1)
{
count1++;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(p[j]==i)
{
cout<<"Q";
}
else
cout<<"#";
}
cout<<endl;
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(hasha[i]==false)
{
bool flag=true;
for(int j=1;j<index;j++)
{
if(abs(index-j)==abs(i-p[j]))
{
flag=false;
break;
}
}
if(flag)
{
p[index]=i;
hasha[i]=true;
getp(index+1);
hasha[i]=false;//递归中i需要重新定义,不然会影响递归返回后下一项操作的结果
}
}
}
return;
}
int main()
{
cout<<"请输入皇后数"<<endl;
cin>>n;
getp(1);
cout<<count1<<endl;
}
在使用递归方法求解八皇后问题时,递归莫名奇妙被退出,按照源码修改多次依旧如此,最后测试多次发现,是变量i,j的问题,i,j一开始被定义为全局变量,在每个递归过程中,i作为全局变量使用,导致递归退出后,i仍然使用的是上一次递归时的值,因此会影响接下来的递归操作,导致递归退出或中断。在递归中的for循环中重新定义i(for(int i;i<.....)),问题就被解决
切记,在递归过程中,慎用全局变量!!!