01321:棋盘问题

news/2025/11/12 22:03:19/文章来源:https://www.cnblogs.com/channy/p/19215638

|DFS|回溯|

难点1:DFS,对于dfs(h,t)表示的“即将在第h行进行摆放,已摆放的棋子数为t个”,即如何在dfs函数内部进行递归:若该棋可以放在第h行的第i个位置(标注take[i]=true),则对改行以下行中所有可行的点进行递归

难点2:回溯算法框架

/* 回溯算法框架 */
void backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {// 判断是否为解if (isSolution(state)) {// 记录解recordSolution(state, res);// 不再继续搜索return;}// 遍历所有选择for (Choice choice : choices) {// 剪枝:判断选择是否合法if (isValid(state, choice)) {// 尝试:做出选择,更新状态makeChoice(state, choice);backtrack(state, choices, res);// 回退:撤销选择,恢复到之前的状态undoChoice(state, choice);}}
}
https://www.cnblogs.com/Ayanowww/p/11555193.html
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>using namespace std;int n,k,res;
char chess[10][10];
bool take[10];  //用于判断该列是否已有棋子//用空间换时间void dfs(int h,int t){//h为即将探索的行数,t为已经摆放的个数if(t==k){res++;return;}if(h==n){return;//回溯,重新探索}for(int i=h;i<n;i++){for(int j=0;j<n;j++){if(chess[i][j]=='#'&&!take[j]){take[j] = true;dfs(i+1,t+1);take[j] = false;//结合回溯算法框架理解}}}
}int main(){while(cin>>n>>k){if(n==-1&&k==-1){break;}for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>chess[i][j];}}for(int i=0;i<n;i++){take[i] = false;}res = 0;dfs(0,0);cout<<res<<endl;}return 0;
}

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

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

相关文章

飞鱼uu单人防空4

飞鱼uu单人防空4盖亚特买40个-->超级防空100-->超级磁能40-->磁能巨无霸20.剩下的随便买.一直造坦克碉堡

C 变量的作用域与生存周期

弄清楚变量的作用域和生存周期,能够让我们不至于犯低级错误; 局部变量 在初学C语言变量的时候,我们通常将变量写在main函数内; 在函数内部,或者{}块内部的变量称为局部变量;它有以下特点:系统不会帮忙初始化,需…

模式识别与机器学习课程笔记(11):深度学习 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python字符串常用操作速查表(全面版v1.0 - 2025年11月12日修订)

Python字符串常用操作速查表(全面版v1.0 - 2025年11月12日修订) 📌 使用说明 时间复杂度:O(1)=常数级(快),O(n)=线性级(随数据量增长),O(k)=取决于传入可迭代对象长度 🔴 字符串(str)为不可变类型,所有&…

05.创建型 - 简单工厂模式(Simple Factory Pattern)

简单工厂模式(Simple Factory Pattern) 定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。 适用场景:(1)需要创建的对象较少。(2)客户端不关心对象的创建过程。例: 你需要一辆…

RabbitMQ延迟队列rabbitmq_delayed_message_exchange

访问:https://www.rabbitmq.com/community-plugins.html 下载rabbitmq_delayed_message_exchange插件,然后将插件文件(rabbitmq_delayed_message_exchange-4.0.2.ez)放置到RabbitMQ的插件目录(/usr/lib/rabbitmq/…

HaluMem:揭示当前AI记忆系统的系统性缺陷,系统失效率超50%

用过聊天机器人的人都遇到过这种情况:你刚说喜欢科幻小说,几轮对话后它给你推荐言情小说。你告诉聊天机器人升职了,但是过会儿又他又问你职业。这种情况不只是健忘而是根本性的bug——AI不仅会丢上下文,还会凭空编…

团队作业2-需求规格说明书

| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience | | 这个作业要求在哪里| https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13481 | | 这…

Mac安装Visual Studio 2019.dmg详细步骤(附图解,小白也能懂,附安装包)

Mac安装Visual Studio 2019.dmg详细步骤(附图解,小白也能懂,附安装包)​ Visual Studio 2019 for Mac是微软推出的 Mac 版集成开发环境(IDE),主要用于开发 C#、.NET、ASP.NET、Xamarin(移动开发)、Unity 游戏…

#题解#洛谷P1496#离散化#

[传送门](P1496 火烧赤壁 - 洛谷) 分析a,b的范围在 - 2 ^ 31 到 2 ^ 31 ,直接开数组用桶来记录每一个点是否染色显然MLE / RE尝试开数组用桶记录一个个区间段是否染色,如何选择区间段的端点呢?显然,只需选取每次染…

20251112 正睿

B对于一个子串,它一定会是两条出边,当且仅当其所有字符相同时达到的节点相同(不妨设这样的字符串为”特殊串“)。 如果不考虑特殊串,答案就是 \(2^n - 1\)。 而只要到达了特殊串,后面就只有 \(|s|\) 种路径了,所…

Polygon:从入门到入门

大概是一份面向新手的 Polygon 算法竞赛出题平台教程。 写在前面 Polygon 是一个自动化程度相当高的算法竞赛出题平台。在开始之前,先简单聊一聊 Polygon 能帮我们干一些什么事情。在 Polygon 上,你可以很方便的进行…

《云操作系统(OpenStack)第二版》学习笔记汇总版-从0开始完成在线安装并为离线安装准备软件包

对着这本书做,发现其中有很多问题,根本做不出来。中间上网查找了不少解决的办法,过程已经不记得了,现在把结果的代码放在这里。 脚本是我写的,一些关键的注释是我写的,不过后来又让豆包重新注释了一遍。 环境规划…

25.11.12 差分约束算法

差分约束算法 一.形式 由一组形如x_i​−x_j≤c​的不等式组成的系统,其中x_i,x_j,是变量,c是常量。 目标是:判断是否有一组 x 值同时满足所有约束;若有,求出一组可行解。 二.思路:转化成最短路问题 1.将x_i​−…

11/12

明天篮球比赛好期待

Linux C/C++ 学习日记(27):KCP协议(三):源码分析与使用示例 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解决Cursor编辑器无法通过include path识别C++头文件的问题

前两天刚刚安装了cursor。在将一个在vscode中写的项目用cursor打开的时候,我发现项目中包含的一个第三方库TableSession.h无法被cursor识别。 我已经在vscode中配置了C/C++ > Default: Include Path项,包含了这个…

麒麟桌面系统2503安装openjdk21

麒麟桌面系统2503安装openjdk211、更新软件包列表 sudo apt update 2、搜索可用的 OpenJDK 版本 apt search openjdk 可以看到通常会列出多个版本(如 OpenJDK 11、17 等),OpenJDK 21 已经进入默认软件源 3、需要的版…

重组蛋白基础与技术概述

重组蛋白是指通过基因工程技术,在宿主细胞中表达和纯化的特定蛋白质分子。这一技术使得科学家能够大规模获得高纯度的目标蛋白,为生命科学研究提供了重要的工具试剂。重组蛋白技术的核心在于将目标蛋白的编码基因导入…