2. 皇后的控制力

题目描述:

我们对八皇后问题进行扩展。

国际象棋中的皇后非常神勇,一个皇后可以控制横、竖、斜线等4个方向(或者说是8个方向),只要有棋子落入她的势力范围,则必死无疑,所以对方的每个棋子都要小心地躲开皇后的势力范围,选择一个合适的位置放置。如果在棋盘上有两个皇后,则新皇后控制的势力范围与第一个皇后控制的势力范围可以进行叠加,这样随着皇后数量的增加,皇后们控制的范围越来越大,直至控制了棋盘中全部的格子。

现在我们关心的是,如果在 N×N 的棋盘上放入 M 个皇后(M个皇后相互之间不能冲突)控制棋盘中的格子,则共有多少种不同的放置方法?

输入:N (N <= 10)  M (M <= N)

输出:如果将 M 个皇后放入 N×N 的棋盘中可以控制全部棋盘中的格子,则不同的放置方法的数量

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 2 1↵
以文本方式显示
  1. 4↵
1秒64M0
测试用例 2以文本方式显示
  1. 3 1↵
以文本方式显示
  1. 1↵
1秒64M0

C++代码 

#include <iostream>
#include <vector>using namespace std;int totalSolutions = 0; // 用于记录不同的放置方法的数量// 检查当前位置是否安全
bool isSafe(int row, int col, const vector<string>& board, int N) {// 检查列for (int i = 0; i < row; ++i) {if (board[i][col] == 'Q') {return false;}}// 检查左上对角线for (int i = row, j = col; i >= 0 && j >= 0; --i, --j) {if (board[i][j] == 'Q') {return false;}}// 检查右上对角线for (int i = row, j = col; i >= 0 && j < N; --i, ++j) {if (board[i][j] == 'Q') {return false;}}return true;
}bool checkControl(const vector<string>& board, int N) {for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {if (board[i][j] == '.') {// 检查当前空点是否被控制bool controlled = false;// 检查列for (int k = 0; k < N; ++k) {if (board[k][j] == 'Q') {controlled = true;break;}}// 检查行for (int k = 0; k < N; ++k) {if (board[i][k] == 'Q') {controlled = true;break;}}// 检查左上对角线for (int k = i, l = j; k >= 0 && l >= 0; --k, --l) {if (board[k][l] == 'Q') {controlled = true;break;}}// 检查右上对角线for (int k = i, l = j; k >= 0 && l < N; --k, ++l) {if (board[k][l] == 'Q') {controlled = true;break;}}// 检查左下对角线for (int k = i, l = j; k < N && l >= 0; ++k, --l) {if (board[k][l] == 'Q') {controlled = true;break;}}// 检查右下对角线for (int k = i, l = j; k < N && l < N; ++k, ++l) {if (board[k][l] == 'Q') {controlled = true;break;}}if (!controlled) {// 如果有任何空点没有被控制,则返回falsereturn false;}}}}// 所有空点都被控制,返回truereturn true;
}// 递归解决问题
void solveNQueensUtil(int row, int N, int M, vector<string>& board) {if (row == N) {if (M == 0 && checkControl(board, N)) {totalSolutions++; // 找到一个解决方案}return;}// 尝试在当前行的每一列放置皇后for (int i = 0; i < N; ++i) {if (isSafe(row, i, board, N)) {board[row][i] = 'Q'; // 放置皇后solveNQueensUtil(row + 1, N, M - 1, board); // 递归到下一行board[row][i] = '.'; // 回溯,移除皇后}}// 如果当前行不放置皇后,也递归到下一行solveNQueensUtil(row + 1, N, M, board);
}// 解决N皇后问题
int solveNQueens(int N, int M) {vector<string> board(N, string(N, '.'));solveNQueensUtil(0, N, M, board);return totalSolutions;
}int main() {int N, M;cin >> N >> M;cout <<  solveNQueens(N, M) << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.4【应用开发】缓冲区(一)

写在前面 缓冲区是存储像素数据的内存区域。多个缓冲区可以与窗口或流相关联,但只有一个缓冲区可以与位图相关联。 一,创建缓冲区 你可以创建内部缓冲区和外部缓冲区,如下: 1.1 内部缓冲区 我们可以通过调用以下Screen API函数来为位图,流,窗口创建内部缓冲区: sc…

O_APPEND影响写入追加,而不影响读文件

O_APPEND 标志用于打开文件时&#xff0c;对写入操作进行追加。它并不直接影响读取文件的操作。 当使用 O_APPEND 标志打开文件时&#xff0c;写入操作会自动将数据追加到文件的末尾&#xff0c;而无论文件指针的位置在哪里。这对于避免并发写入时的竞争条件非常有用&#xff…

腾讯云服务器优惠活动大全页面_全站搜优惠合集

腾讯云推出优惠全站搜页面 https://curl.qcloud.com/PPrF9NFe 在这个页面可以一键查询所需云服务器、轻量应用服务器、数据库、存储、CDN、网络、安全、大数据等云产品优惠活动大全&#xff0c;活动打开如下图&#xff1a; 腾讯云优惠全站搜 腾讯云优惠全站搜页面 txybk.com/go…

java-IO流

File类 引入 【1】文件&#xff0c;目录&#xff1a; 文件&#xff1a; 内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。一篇文章、一段视频、一个可执…

Element的安装以及基本使用

Element是基于Vue的网站组件库&#xff0c;用于快捷构建网页 像上面这样的样式 官网地址 Element - 网站快速成型工具 安装 npm i element-ui -S 装包命令 npm install babel-plugin-component -D 安装好之后会在package.json里面显示版本 在node_modules中会自动初始化一个 …

opencv中叠加Sobel算子与Laplacian算子实现边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

记录一次API报文替换点滴

1. 需求 各位盆友在日常开发中&#xff0c;有没有遇到上游接口突然不合作了&#xff0c;临时需要切换其他接口的情况&#xff1f;这不巧了&#xff0c;博主团队近期遇到了&#xff0c;又尴尬又忐忑。 尴尬的是临时通知不合作了&#xff0c;事前没有任何提醒&#xff1b; 忐忑…

C语言:文件操作

文章目录 每日一言文件操作文件的打开和关闭操作&#xff1a;文件的读写操作&#xff1a; 结语 每日一言 If I have seen further, it is by standing on the shoulders of giants. 如果我能看得更远&#xff0c;是因为站在巨人的肩膀上。 文件操作 C语言文件操作主要通过文…

基于SpringBoot和微信小程序的校园快递平台系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot和微信小程序的校园快递平…

AI浅谈:计算机视觉(CV)技术的优势和挑战

目录 一、计算机视觉技术的优势 1.效率和精度提高 2.提高安全性 3.促进自动化 4.促进科学研究 5.促进商业发展 二、计算机视觉技术的挑战 1.环境变化 2.精度问题 3.隐私和安全问题 4.数据质量 5.系统复杂度 以上是对计算机视觉技术的优势和挑战的概述&#xff0c;…

《哥德尔证明》阅读笔记——一致性问题的绝对证明

前言 追问一个公理系统的一致性&#xff0c;我们知道一个模型法&#xff0c;即从现实经验中找到一个模型&#xff0c;能将所有公理映射成此模型的真陈述&#xff0c;但很多系统模型是无穷的&#xff0c;比如想检验“空间中两点能确定一条直线”这个欧氏几何公理在空间模型中的…

MQTT 介绍与学习 —— 筑梦之路

之前写过的相关文章&#xff1a; MQTT协议&#xff08;转载&#xff09;——筑梦之路_mqtt url-CSDN博客 k8s 部署mqtt —— 筑梦之路-CSDN博客 CentOS 7 搭建mqtt服务——筑梦之路_腾讯云宝塔搭 centos 7.9.2009 x86_64 建标准mqtt服务器-CSDN博客 mqtt简介 MQTT&#xff…

Js中数组的实用语法

1. 循环 a. 循环项 const arr [1, 2, 3];for (let item of arr) {console.log(item); } // 输出&#xff1a;1 2 3b. 循环键 const arr [1, 2, 3];for (let key in arr) {console.log(key); } // 输出&#xff1a;0 1 2c. 循环键值对 const arr [1, 2, 3];arr.forEach((…

Mysql数据库 19.Mysql 锁

MySQL锁 锁&#xff1a;锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制&#xff0c;在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源&#xff0c;如何保证数据并发访问的一…

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解&#xff1a;流程总结&#xff1a;条件匹配解释&#xff1a;其他解释&#xff1a; SpringBoot 自动装配原理 源码流程详解&#xff1a; 1、先看启动类&#xff0c;启动这个main方法&#xff0c;然后调用这个run方法。 2、把 启动类作…

南京邮电大学数据库实验二

1. 用create database命令创建电影数据库(MovieDB)。 create database MovieDB; 在创建表之前需调用一下指定的数据库&#xff1a; use MovieDB; 2.在电影数据库中用create table 命令创建如下5个关系模式&#xff1a; 创建movies表&#xff1a; create table Movies( ti…

城市货车通行码二维码解析

目录 说明 界面 下载 城市货车通行码二维码解析 说明 二维码扫描信息为&#xff1a; tmri://12123?ywlx1041&ewmeyJ0eHpiaCI6IjUxMDcwMDAwMDE0MyIsInR4em1jIjoiQeivgSIsImhwemwiOiIwMiIsImhwaG0iOiLlt51CMkwzMjYiLCJrc3JxIjoiMjAyMS0xMS0yOCIsImpzcnEiOiIyMDIyLTEyL…

虚幻学习笔记12—C++类的实例化

一、前言 本系列如无特殊说明使用的虚幻版本都是5.2.1&#xff0c;VS为2022版本。在Unity中通常创建的脚本都默认继承了MonoBehavior&#xff0c;都是不能再用代码New而实例化的&#xff0c;虚幻也是一样不能直接New来实例化。在Unity中是通过Instantiate方法来实例化一个游戏对…

C++ lambda表达式

写法格式 lambda表达式的写法格式如下&#xff1a; [capture-list] (parameters) mutable -> ret { statement } 各部分的说明为&#xff1a;[capture-list] : 捕获列表&#xff0c;编译器根据[]来判断接下来的代码是否为lambda函数&#xff0c;捕捉列表能够捕捉上下文中…