#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
bool Check(int rowCurrent,int *&NQueen);
void Print(ofstream &os,int n,int *&NQueen);
void Solve(int rowCurrent,int *&NQueen,int n,int &count, ofstream &os);
bool Check(int rowCurrent,int *&NQueen)
{
int i = 0;
while(i < rowCurrent)
{
if(NQueen[i] == NQueen[rowCurrent] || (abs(NQueen[i]-NQueen[rowCurrent]) == abs(i-rowCurrent)) )
{
return false;
}
i++;
}
return true;
}
void Print(ofstream &os,int n,int *&NQueen)
{
os<<"一次调用\n";
for (int i = 0;i < n;i++) {
for(int j = 0 ; j < n; j++)
{
os<<(NQueen[i]==j?1:0);
os<<setw(2);
}
os<<"\n";
}
os<<"\n";
}
void Solve(int rowCurrent,int *&NQueen,int n,int &count, ofstream &os)
{
if(rowCurrent == n)
{
Print(os,n,NQueen);
count++;
}
for(int i = 0; i < n; i++)
{
NQueen[rowCurrent] = i;
if(Check(rowCurrent,NQueen))
{
Solve(rowCurrent+1,NQueen,n,count,os);
}
}
}
int main()
{
int n;
int count = 0;
cout<<"请输入问题的规模N"<<endl;
cin>>n;
if(n<4)
{
cerr<<"问题规模必须大于4"<<endl;
return 0;
}
int *NQueen = new int[n];
ofstream os;
os.open("result.txt");
Solve(0,NQueen,n,count,os);
cout<<"问题的解有"<<count<<"种方法"<<endl;
os.close();
return 0;
}