当前位置: 首页 > 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;
}

http://www.dtcms.com/a/121005.html

相关文章:

  • 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.】解决方案
  • Redis的主从复制
  • 解码AI大脑:Claude的思维显微镜与语言炼金术
  • 数学知识——矩阵乘法
  • 牛客KY222 打印日期
  • Spring Boot 3.5新特性解析:自动配置再升级,微服务开发更高效
  • 【设计模式】模板模式
  • LeetCode详解之如何一步步优化到最佳解法:26. 删除有序数组中的重复项
  • 解决leetcode第3510题移除最小数对使数组有序II
  • Flutter性能优化终极指南:从JIT到AOT的深度调优
  • 视频孪生赋能交警构建“空地一体“智慧交管体系的创新实践