在学算法导论写n皇后问题的时候,把每次调用的解存入vector里,但是报错,看了其他的帖子并没有发现我的代码里有空指针的情况,请问各位大神有什么解决办法。很急很关键!
代码:
#include <iostream>
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int j=1;
vector< vector<int> > A;
class Queen
{
public:
int n; //皇后个数
int *x; //存放皇后坐标的指针数组
int sum; //最后解的个数
Queen(); //Queen的构造函数
~Queen();//Queen的析构函数
void setn(int num);
bool Place(int t);
void Backtrack(int t);
void outputX();
void outputsum();
};
Queen::Queen()
{
sum=0;
n=0;
x= NULL;
}
Queen::~Queen()
{
delete []x;
}
void Queen::setn(int num)
{
n=num;
x=new int[num+1];
}
bool Queen::Place(int t)
{
int i;
for(i=1; i<t; i++)
if ((abs(t-i) == abs(x[i]-x[t])) || (x[i] == x[t])) //如果前t-1行存在一个皇后棋子和t行的皇后在同一列或同一斜对角线
return false;
return true;
}
void inputX(int *x)
{
int i;
for (i=1; x[i]!=0; i++)
A[::j][i]=x[i];
::j++;
}
void Queen::Backtrack(int t)
{
int i;
if (t>n)
{
sum++; //如果t>n,那么上一步的t已经是问题的一个可行解,此时循环结束,sum++
inputX(x);
}
else
{
for(x[t] = 1;x[t]<=n;x[t]++)
if (Place(t)) Backtrack(t+1);
}
}
void Queen::outputX()
{
int i;
int k;
for (k=1; k<=j; k++)
for (i=1; i<=n; i++)
cout<<A[j][i]<<" ";
cout<<endl;
}
void Queen::outputsum()
{
cout <<"Total="<<sum<<endl;
}
int main()
{
Queen MyQueen;
//int pnumber; //number的个数
int number;
int totalsum=0;
fstream fin("queen.in"); //打开文件
string ReadLine;
while(getline(fin,ReadLine)) //逐行读取,直到结束
{
/*if(ReadLine=0)
cin>>pnumber;
else*/
fin>>number;
MyQueen.setn(number);
MyQueen.Backtrack(1);
MyQueen.outputsum();
MyQueen.outputX();
totalsum+=MyQueen.sum;
MyQueen.sum=0;
cout<<"totalsum: "<<totalsum<<endl;
}
fin.close();
system("pause");
return 0;
}
报错: