皇后摆放问题自写代码的不明之处

问题如下:
国际象棋的棋盘可以看做是一个 8 × 8 的矩阵,上面每一个格子仅能放一枚棋子,现在给出一个 8 × 8 的由 0 和 1 组成的矩阵,代表象棋棋盘,1 代表当前位置放置了一个皇后,0 则代表什么都没有放,上面有 n(n 为小于 8 的正整数)个位置已经放上了皇后棋子(相互之间不冲突,合理摆放),现在另外给你 8 - n 个皇后,问你有多少合理的摆法。

输入描述:
一个 8 × 8 的由 0 和 1 组成的矩阵。

输出描述:
一个整数,为摆放的种类数。

样例输入:
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
样例输出:
4
我的代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int board[8][8]={0};
int b[8]={0};
int p[8]={0};
int total=0;
int count1=0;
int count2=0;
int c=0;
int k=0;
bool set(int i,int j){//测试(i,j)是否可放皇后 
    if(b[i]!=0)
        return false;//i行已有皇后,不可再放 
    for(int k=0;k<8;k++){
        if(b[k]!=0&&(b[k]==j||abs(b[k]-j)==abs(i-k)))
            return false;
    }
    return true;
}

void queen(int c){

    if(c==k){
        total++; 
        
    }
    else 
    for(int j=0;j<8;j++){
        if(set(p[c],j)){
            b[p[c]]=j;
            queen(c+1);
            b[p[c]]=0; 
    
        }
    
    }
}


int main(){
    int i,j;
    total=0;
    
    for(i=0;i<8;i++){
        int f=1;
        for(j=0;j<8;j++){
            scanf("%d",&board[i][j]);
            if(board[i][j]==1){
        
                b[i]=j;
                count1++; 
                f=0;
            }
        }
        if(f) p[k++]=i;
    }
    queen(0);
    printf("%d",total);
    return 0;
}

我的想法是将空行以p[]表示出来,然后用queen()递推,但是答案总是会打好多,手头模拟也没找出来哪里有问题,请问哪里有问题,啦


#include<bits/stdc++.h>
using namespace std;
int a[1000],b[1000],c[1000],d[1000];//行 列 左下到右上 左上到右下
int ans;
int m[100][100];
void dfs(int i)
{
    if(i==8+1){
        ans++;
        return;
    }
    if(a[i]){
        dfs(i+1);
        return;
    }
    for(int j=1;j<=8;j++)
        if((!b[j])&&(!c[i+j])&&(!d[i-j+8])){
            a[i]=j;
            b[j]=1;
            c[i+j]=1;
            d[i-j+8]=1;
            dfs(i+1);
            a[i]=0;
            b[j]=0;
            c[i+j]=0;
            d[i-j+8]=0;
        }
}

int main()
{
    for(int i=1;i<=8;i++)
        for(int j=1;j<=8;j++){
            cin>>m[i][j];
            if(m[i][j]==1){
                a[i]=j;
                b[j]=1;
                c[i+j]=1;
                d[i-j+8]=1;
            }
        }
    dfs(1);
    cout<<ans<<endl;
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

手动观察变量时候发现了是初始化为0与第0列的冲突问题导致了错误,
贴上修改后正确代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int board[9][9]={0};
int b[9]={0};
int p[9]={0};
int total=0;
int count1=0;
int count2=0;
int c=1;
int k=1;
bool set(int i,int j){//测试(i,j)是否可放皇后 
    if(b[i]!=0)
        return false;//i行已有皇后,不可再放 
    for(int k=1;k<=8;k++){
        if(b[k]!=0&&(b[k]==j||abs(b[k]-j)==abs(i-k)))
            return false;
    }
    return true;
}

void queen(int c){

    if(c==k){
        total++;
    }
    else{
    int cur=p[c];
    for(int j=1;j<=8;j++){
        if(set(cur,j)){
            
            b[cur]=j;
            queen(c+1);
        
            b[cur]=0; 
        
        }
    
    }
    }
}


int main(){
    int i,j;
    total=0;
    
    for(i=1;i<=8;i++){
        int f=1;
        for(j=1;j<=8;j++){
            scanf("%d",&board[i][j]);
            if(board[i][j]==1){
        
                b[i]=j;
                count1++; 
                f=0;
            }
        }
        if(f) p[k++]=i;
    }

    queen(1);
    
    printf("%d",total);

    return 0;
}