1114棋盘问题acwing(深度优先搜索)

题目描述

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。

要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 kk 个棋子的所有可行的摆放方案数目 CC。

输入格式

输入含有多组测试数据。

每组数据的第一行是两个正整数 n,kn,k,用一个空格隔开,表示了将在一个 n∗nn∗n 的矩阵内描述棋盘,以及摆放棋子的数目。当为-1 -1时表示输入结束。

随后的 nn 行描述了棋盘的形状:每行有 nn 个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

输出格式

对于每一组数据,给出一行输出,输出摆放的方案数目 CC (数据保证 C<231C<231)。

数据范围

n≤8,k≤nn≤8,k≤n

输入样例:
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
输出样例:
2
1

代码如下:

#include <bits/stdc++.h>
using namespace std;// 全局变量声明
int res = 0;            // 结果,存储可行方案数目
int nn = 0, number = 0; // nn为棋盘大小n,number为需要放置的棋子数k
vector<bool> v;         // 标记列是否被占用,v[i]为true表示第i列已被使用
vector<vector<char>> b; // 棋盘,存储'#'和'.',b[x][i]表示第x行第i列// 深度优先搜索函数
// 参数x:当前处理的行号,count:已放置的棋子数目
void dfs(int x, int count) {// 如果已放置number个棋子,方案数+1并返回if (count == number) {res++;return;}// 若超出棋盘行数,直接返回if (x > nn) {return;}// 遍历当前行的所有列,尝试放置棋子for (int i = 1; i <= nn; i++) {// 如果当前列未被占用且该位置可放置if (!v[i] && b[x][i] == '#') {v[i] = true;           // 标记该列为已使用dfs(x + 1, count + 1); // 递归处理下一行,棋子数+1v[i] = false;          // 回溯,撤销列的标记}}// 不放置当前行的棋子,直接处理下一行dfs(x + 1, count);
}int main() {// 循环处理多组输入,直到输入-1 -1为止while (1) {cin >> nn >> number;if (nn == -1 && number == -1)break;// 初始化棋盘和标记数组b.assign(nn + 1, vector<char>(nn + 1, 0));v.assign(nn + 1, false);// 读取棋盘数据,注意行和列从1开始存储for (int i = 1; i <= nn; i++) {for (int j = 1; j <= nn; j++) {cin >> b[i][j];}}res = 0;            // 重置结果dfs(1, 0);           // 从第1行开始搜索,初始已放置0个棋子cout << res << endl; // 输出当前棋盘的方案数}return 0;
}/*
思路详解:
1. **问题分析**:在n×n棋盘的'#'位置放置k个棋子,要求任意两个棋子不同行不同列。需要计算所有可行方案数。
2. **搜索策略**:采用深度优先搜索(DFS)逐行处理,每行有两种选择:放置或不放置棋子。
3. **放置规则**:- 在当前行选择一个未被占用的列(对应'#'位置)。- 标记该列,递归处理下一行。- 回溯时撤销列的标记,以尝试其他可能的列。
4. **剪枝与终止条件**:- 当已放置k个棋子时,方案数+1。- 当处理完所有行时终止当前路径。
5. **复杂度优化**:逐行处理避免行冲突,列标记数组避免列冲突,确保每行每列最多一个棋子。
6. **递归过程**:每次递归处理下一行,确保行号递增,从而覆盖所有行选择组合。
*/

代码说明

  1. DFS 递归搜索
    • 遍历当前行 x 的所有列,如果当前格子是 # 且该列未被占用,就放置棋子,并递归搜索下一行。
    • 不放置棋子,直接跳到下一行,保证搜索完整棋盘。
  2. 回溯
    • 递归调用 dfs(x+1, count+1); 进入下一行。
    • 递归返回后,取消该列的占用状态v[i] = false;),以便尝试其他方案。
  3. 终止条件
    • 棋子数量等于 k:找到一种有效方案,res++ 并返回。
    • 超出行界限 x > n:无效路径,直接返回。

时间复杂度分析

最坏情况下,n=8k=8,即 8! ≈ 40,320,这种规模可以接受。

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

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

相关文章

logback日志输出配置范例

logback日志输出配置范例 在wutool中&#xff0c;提供了logback日志输出配置范例&#xff0c;实现日志文件大小限制、滚动覆盖策略、定时清理等功能。 关于wutool wutool是一个java代码片段收集库&#xff0c;针对特定场景提供轻量解决方案&#xff0c;只要按需选择代码片段…

测试人员如何驱动开发?

软件开发中测试人员的作用正在从传统的缺陷发现者演变为开发过程的主动推动者。特别是在敏捷和 DevSecOps 环境中&#xff0c;测试人员如何通过参与需求、提供反馈和推动自动化来驱动开发&#xff0c;成为一个值得探讨的话题。本文将详细分析测试人员驱动开发的具体方式&#x…

大模型语料库的构建过程 包括知识图谱构建 垂直知识图谱构建 输入到sql构建 输入到cypher构建 通过智能体管理数据生产组件

以下是大模型语料库的构建过程&#xff1a; 一、文档切分语料库构建 数据来源确定&#xff1a; 首先&#xff0c;需要确定语料库的数据来源。这些来源可以是多种多样的&#xff0c;包括但不限于&#xff1a; 网络资源&#xff1a;利用网络爬虫技术从各种网站&#xff08;如新闻…

oracle游标为什么没有共享,统计一下原因

-- Script Code为什么没共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防战——深入浅出Map/Set的底层实现

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习Map/Set的底层实现 目录 问题一&#xff1a;hash会出现负数&#xff1f;数组越界 一&#xff1a;什么是二叉搜索树&#xff1f…

win10使用haneWIN NFS Server挂载NFS v2服务,u-boot通过NFS下载zImage

1. haneWIN NFS Server挂载NFS v2服务 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系统与目录结构

Linux系统中一切皆文件 bin 是Binary 的缩写, 这个目录存放着最经常使用的命令 boot 这里存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件&#xff0c;自 己的安装别放这里。 cdrom 这个目录通常专门用来挂载光盘。当系统刚安装时&#x…

一文详解基于NarrotoAI的短剧短视频自动解说、混剪AI平台搭建

背景 前阵给孩子做电子相册学了点剪辑技术&#xff0c;就想凑个热闹剪剪短剧玩玩&#xff0c;一是学以 致用&#xff0c;再者也好奇短剧创作为啥这么火&#xff0c;跟个风。 初步了解情况后&#xff0c;发现我的剪辑技术已经落后了&#xff0c;行家们玩的主要是解说 &#xf…

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

《Canvas修仙传·第三重天金丹境(下集)》 ——量子烟花与物理宇宙的混沌法则

各位道友久候&#xff01;上集我们炼就了《灵蛇奇谭》的元神&#xff0c;今日将开启Canvas修仙路上最绚丽的篇章——掌控微观粒子的创世之力&#xff01;(&#xff89;≧∀≦)&#xff89; 章前黑话词典 &#x1f50d; 量子境术语表&#xff1a; 对象池&#xff08;Object Po…

c++ namespace名字域空间

在C中&#xff0c;namespace 是一个非常重要的概念&#xff0c;用于组织代码&#xff0c;避免名称冲突。namespace&#xff08;命名空间&#xff09;是一个逻辑上的代码组织单元&#xff0c;用于将代码&#xff08;类、函数、变量等&#xff09;分组&#xff0c;从而避免命名冲…

获取阿里云OSS预签名URL下载(java)

1,引入依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> <!--AliSms--> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-s…

中间件专栏之Redis篇——Redis的基本IO网络模型

Redis主要采用的是单线程的事件驱动模型&#xff0c;通过I/O多路复用来实现高效的并发请求处理。 一、单线程模型 Redis 采用 单线程模型 来处理所有请求&#xff0c;包括网络 I/O 和命令执行。虽然现代多核 CPU 能够并行处理任务&#xff0c;但 Redis 的设计原则是尽量避免多…

Python 线程同步

Python 线程同步 Python 线程同步 Python 线程同步 线程同步是一种确保两个或多个线程不同时执行同一块共享代码的机制。共享块中的代码通常是访问共享数据或资源&#xff0c;这种共享块被称作临界区。这个概念可以用下面的图清晰地表示出来&#xff1a; #mermaid-svg-2TivIuc…

Linux操作系统5-进程信号3(信号的捕捉流程,信号集,sigaction)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的保存, 用户态与内核态&#xff0c;内核空间&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;​​​​​​​myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点…

【机器学习chp10】降维——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目录 一、降维的意义与本质 1、意义 2、本质 3、常见降维方法 &#xff08;1&#xff09;线性降维 &#xff08;2&#xff09;非线性降维 二、基于重构的降维 1、PCA 2、核化PCA &#xff08;1&#xff09;实现过程 步骤一&#xff1a;数据映射与核函数定义 步骤二…

代码的解读——自用

代码来自&#xff1a;https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能总结 该脚本用于执行一个 弱监督语义分割&#xff08;WSSS&#xff09; 的完整流程&#xff0c;包含三个阶段&#xff1a; Stage1&#xff1a;训…

Powershell和BTEQ工具实现带多组参数和标签的Teradata数据库批量数据导出程序

设计一个基于多个带标签SQL模板作为配置文件和多组参数的Powershell代码程序和BTEQ工具&#xff0c;实现根据不同的输入参数&#xff0c;自动批量地将Teradata数据库的数据导出为CSV文件到指定目录上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数…

CF 118A.String Task(Java实现)

题目分析 输入一个字符串&#xff0c;遍历每一个字符&#xff0c;如果是元音字母就删除&#xff0c;辅音字母就在其前面增加一个.&#xff0c;且所有字母输出都是小写。 思路分析 将输入的字符串改为字符数组&#xff0c;考虑到任意位置插入的情况&#xff0c;所以主要选择Lin…

LLM进阶

prologue&#xff1a;最近大模型火出天际&#xff0c;I’m definitely aware I’m late to the party&#xff0c;2022年毕业之后就很少在系统的跟踪一个domain了&#xff0c;所以这次下定决心要跟踪一下大模型的技术细节和实现过程&#xff0c;不做AI丁真 本文三条主线&#…