当前位置: 首页 > news >正文

蓝桥云客--黑白皇后

1.黑白皇后【省模拟赛】 - 蓝桥云课

问题描述

给定一个 n×n 的棋盘。现在要向棋盘中放入 n 个黑皇后和 n 个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?

输入格式

输入的第一行包含一个整数 n。

输出格式

输出一行包含一个整数,表示答案。

样例输入

4

样例输出

2

评测用例规模与约定

共有 10 个评测用例,评测用例各不相同。
对于所有评测用例,2≤n≤11。

思路:
本质上个跟八皇后一样,主要是组合问题。

代码如下:
 

#include <bits/stdc++.h>
using namespace std;
 
// 白皇后 
bool white_ranks[30], white_nd[30], white_pd[30];
int white_ans[20000][30]; 
// 黑皇后
bool black_ranks[30], black_nd[30], black_pd[30];
int black_ans[20000][30]; 
// 临时数组
int res[30]; 
// 白皇后方案数量
int w_cnt = 0;
// 黑皇后方案数量
int b_cnt = 0;
int n;
 
void white_dfs(int x) 
{
    if (x > n) 
    {
        w_cnt++;
        for (int y = 1; y <= n; y++) 
        {
            white_ans[w_cnt][y] = res[y];
        }
        return;
    }
    for (int y = 1; y <= n; y++) 
    {
        if (white_ranks[y] || white_nd[x + y] || white_pd[x - y + n]) 
        {
            continue;
        }
        white_ranks[y] = true;
        white_nd[x + y] = true;
        white_pd[x - y + n] = true;
        res[x] = y;
        white_dfs(x + 1);
        res[x] = 0;
        white_ranks[y] = false;
        white_nd[x + y] = false;
        white_pd[x - y + n] = false;
    }
}
 
void black_dfs(int x) 
{
    if (x > n) 
    {
        b_cnt++;
        for (int y = 1; y <= n; y++) 
        {
            black_ans[b_cnt][y] = res[y];
        }
        return;
    }
    for (int y = 1; y <= n; y++) 
    {
        if (black_ranks[y] || black_nd[x + y] || black_pd[x - y + n]) 
        {
            continue;
        }
        black_ranks[y] = true;
        black_nd[x + y] = true;
        black_pd[x - y + n] = true;
        res[x] = y;
        black_dfs(x + 1);
        res[x] = 0;
        black_ranks[y] = false;
        black_nd[x + y] = false;
        black_pd[x - y + n] = false;
    }
}
 
int main() 
{
    cin >> n;
    // 搜索白皇后的放置方案
    white_dfs(1);
    // 搜索黑皇后的放置方案
    black_dfs(1);
    int total = 0;
    for (int i = 1; i <= w_cnt; i++) 
    {
        for (int j = 1; j <= b_cnt; j++) 
        {
            bool found = true;
            for (int k = 1; k <= n; k++) 
            {
                if (white_ans[i][k] == black_ans[j][k]) 
                {
                    found = false;
                    break;
                }
            }
            if (found) 
            {
                total++;
            }
        }
    }
    cout << total;
    return 0;
}

相关文章:

  • fisco-bcos 关于服务bash status.sh启动runing 中但是5002端口监听不到,出错的问题
  • Dynamic Programming(LeetCode 740)
  • 串联所有单词的字串 --- 滑动窗口
  • Python 网络请求利器:requests 包详解与实战
  • nt!KeRemoveQueue 函数分析之加入队列后进入等待状态
  • Verilog学习-1.模块的结构
  • 图灵逆向——题六-倚天剑
  • 费马小定理
  • FRP调用本地摄像头完成远程拍照
  • 2台8卡L20服务器集群推理方案
  • FlashDB 在嵌入式系统中占用硬件资源
  • 2025 跨平台技术如何选:KMP 与 Flutter 的核心差异
  • 【ISP】ISP pipeline(AI)
  • 创建采购申请报错不可能为销售订单或项目库存确定科目 消息号 ME558
  • dubbo配置中心
  • 内核态切换到用户态
  • ①(PROFINET 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • 【Nodebb系列】Nodebb笔记写入方案
  • DDPM理论基础解析
  • 使用chainlit出现【无法访问服务器】或【Could not reach the server.】解决方案
  • 东城免费做网站/搜索网站有哪些
  • 网站策划书哪个容易做/三只松鼠软文范例500字
  • p2p网站制作价格/想要导航推广网页怎么做
  • net网站开发视频/网络营销平台名词解释
  • 青海哪家做网站的公司最大/开封搜索引擎优化
  • 做信息图的网站/百度百科官网首页