解题思路:





注意事项:





参考代码:

#include <iostream>  
#include <cmath>  
#include <stdio.h>  
#include <string>  
#include <cstring>  
#include <map>  
#include <set>  
#include <vector>  
#include <stack>  
#include <queue>  
#include <iomanip>  
#include <algorithm>  
#include <memory.h>  
using namespace std;  
const int MAX=10;  
int Map[MAX][MAX];  
int visit[MAX][MAX];  
int q_w[MAX],q_b[MAX];//第i个元素所在的列,行肯定是不同的  
int n;  
int sum;  
  
void init()  
{  
    memset(visit,0,sizeof(visit));  
    memset(q_w,0,sizeof(q_w));  
    memset(q_b,0,sizeof(q_b));  
    sum=0;  
}  
  
  
int place(int *q,int r,int c)//判断位置是否合法  
{  
    int i;  
    int t_r,t_c;  
    for(i=0;i<r;i++)  
    {  
        t_r=i;  
        t_c=q[i];  
        if(abs(r-t_r)==abs(c-t_c)||(c-t_c==0))//不在同一对角线,不在同一列  
            return 0;  
    }  
    return 1;  
}  
  
void dfs_w(int r)//搜索白皇后  
{  
    if(r==n)  
    {  
        sum++;  
        return;  
    }  
    for(int i=0;i<n;i++)  
    {  
        if(visit[r][i]==0&&Map[r][i]==1&&place(q_w,r,i))  
        {  
            q_w[r]=i;  
            dfs_w(r+1);  
        }  
    }  
}  
  
void dfs_b(int r)//搜索黑皇后  
{  
    if(r==n)//找到一个黑皇后的的满足条件  
    {  
        dfs_w(0);//搜索白皇后  
        return;  
    }  
    for(int i=0;i<n;i++)  
    {  
        if(Map[r][i]==1&&place(q_b,r,i))  
        {  
            q_b[r]=i;  
            visit[r][i]=1;  
            dfs_b(r+1);  
            visit[r][i]=0;  
        }  
    }  
}  
  
void input()  
{  
    cin>>n;  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<n;j++)  
        {  
            cin>>Map[i][j];  
        }  
    }  
}  
  
  
  
int main()  
{  
    init();  
    input();  
    dfs_b(0);  
    cout<<sum<<endl;  
    return 0;  
}


点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论