N皇后的算法问题,当N大于八时就不行了

期末作业。。自己写的算法当N大于8时就不行了,找了好久不知道错哪,救助大佬!

#include <iostream>
#include <assert.h>
using namespace std;
int solution=0;
int C=0;
int n;
bool **p; //p为大棋盘
bool **p1;  //p1为记录哪些位置放置过皇后
int pWork0(int r=0,int c=0);
void pBack(int r);
void pFlag(int now_r,int now_c);
void Reset(bool **p);
bool pFindFalse();
bool p1WhetherFlag(int r);
void p1Clean(int r);
int main()
{
    cout<<"请输入n的值:";
    cin>>n;
    p=new bool *[n];
    p1=new bool *[n];
    for(int i;i<n;i++){
        p[i]=new bool [n];
        p1[i]=new bool [n];
    }
    Reset(p);
    Reset(p1);
    pWork0(0,0);
    return 0;
}
int pWork0(int r,int c) //n%2=0
{
    assert(r<=n&&c<=n);
    if(C==n)
    {
        cout<<"共有"<<solution<<"种解法"<<endl;
        delete[] p;
        delete[] p1;
        exit(0);
    }
    else if(r==n-1&&pFindFalse())
    {
        cout<<solution<<endl;
        solution++;
        pBack(n-2);
    }
    else if(!p[r][c])
    {
        pFlag(r,c);
        p1[r][c]=true;
        pWork0(++r,0);
    }
    else
    {
        if(c<n-1) pWork0(r,++c);
        else pBack(r-1);
    }
}

void pBack(int r)
{
//能回溯:
    for(int i=r;i>0;i--)
    {
        p1Clean(i);
        //重新给p标记
        Reset(p);
        for(int o=0;o<i;o++)
        {
            for(int k=n-1;k>=0;k--)
            {
                if(p1[o][k]) {pFlag(o,k);break;}
            }
        }
        //如果能回溯的话:
        for(int u=0;u<n;u++)
        {
            if(p[i][u]==false&&p1[i][u]==false&&p1WhetherFlag(i)) pWork0(i,u);
        }
    }
//不能回溯:
    Reset(p);
    Reset(p1);
    pWork0(0,++C);
}
void pFlag(int now_r,int now_c)  //标记不能放置的位置
{
    for(int i=0;i<n;i++){
        p[now_r][i]=true;
    }
    for(int i=0;i<n;i++){
        p[i][now_c]=true;
    }
    for(int r=now_r,c=now_c;c<n&&c>=0&&r<n&&r>=0;){
        p[r++][c++]=true;
    }
    for(int r=now_r,c=now_c;c<n&&c>=0&&r<n&&r>=0;){
        p[r--][c++]=true;
    }
    for(int r=now_r,c=now_c;c<n&&c>=0&&r<n&&r>=0;){
        p[r++][c--]=true;
    }
    for(int r=now_r,c=now_c;c<n&&c>=0&&r<n&&r>=0;){
        p[r--][c--]=true;
    }
}
void Reset(bool **p)  //重置数组
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            p[i][j]=false;
}
bool pFindFalse()
{
    for(int i=0;i<n;i++){
        if(p[n-1][i]==false) return true;
    }
    return false;
}
bool p1WhetherFlag(int r)
{
    for(int j=0;j<n;j++)
    {
        if(p1[r][j]) return true;
    }
    return false;
}
void p1Clean(int r)  //清除p1数组某行后的数据
{
    for(int i=r+1;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            p1[i][j]=false;
        }
    }
}
 

写for循环直接判断就行了。

#include <iostream>
using namespace std;
 
const int N = 8;
int arr[10], total_cnt;
// arr记录每一行(X)皇后的Y坐标
 
bool isPlaceOK(int *a, int n, int c) {
    for (int i = 1; i <= n - 1; ++i) {
        if (a[i] == c || a[i] - i == c - n || a[i] + i == c + n)
            return false;
        //检查位置是否可以放
        //c是将要放置的位置
        //a[i] == c如果放在同一列,false
        //a[i] -+ i = c -+ n 如果在对角线上,false
    }
    return true;
}
 
void printSol(int *a) {
    for (int i = 1; i <= N; ++i) { //遍历每一行
        for (int j = 1; j <= N; ++j) { //遍历每一列
            cout << (a[i] == j ? "X" : "-") << " ";;
        } //如果标记数组中这一行的皇后放在j位置,则输出X,否则输出-,
        //用空格分隔
        cout << endl; //每一行输出一个换行
    }
    cout << endl; //每一组数据一个换行分隔
}
 
void addQueen(int *a, int n) {
    if (n > N) { //n代表从第一行开始放置
        printSol(a);
        total_cnt++;
        return ;
    }
    for (int i = 1; i <= N; ++i) { //i从第1列到第N列遍历
        if (isPlaceOK(a, n, i)) {
            a[n] = i; //如果可以放置,就把皇后放在第n行第i列
            addQueen(a, n + 1);
        }
    }
 
}
 
int main() {
    addQueen(arr, 1);
    cout << "total: " << total_cnt << " solutions.\n";
    return 0;
}