百练 1321: 棋盘问题

ACM — POJ1321-棋盘问题 题目链接:https://vjudge.net/problem/POJ-1321 思路一:首先我们可以明确这是一个深度搜索的题目,与八皇后问题相似。我们建立一个函数DFS用来累计可行的方案数,我们走过一列我们就把它标记下来下次的时候就不可以再摆放在这一列(因为题目要求不可以将棋子摆放在同一行和同一列)然后就从下一行开始寻找可行的地方,直到我们摆放的棋子数与我们被要求摆放的棋子数相同时,我们... 阅读详情

百练 1321: 棋盘问题

总时间限制:1000ms 内存限制: 65536kB
原题OJ链接

描述

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

输入

输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

输出

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

样例输入

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

样例输出

2
1

解题思路

我们在这里采用分治的思想,把问题一步一步拆分成子问题。
要解决k个棋子的问题,也就是要解决k-1个棋子的子问题再乘以第k个棋子的方法数;要解决k-1个棋子的问题,也就是要解决k-2个棋子的子问题…………如此递归下去,直至要解决0个棋子的问题的时候,就是到终点要return的时候了。

dfs的经典三层结构:

dfs()
{
    if条件判断——(到终点) 
    {
        操作……
        return;
    }
    if……省略一些条件判断(剪枝优化,比如一些没必要的continue或者计算过的子问题的标记备忘录直接存取)
    for()
        if……满足条件的筛选
        修改标记;
        dfs();
        改回标记;
}

(注:有些情况下是不需要dfs三层结构第三层:改回标记 这一操作的,见bnuoj12921或bnuoj1681, 这种情况多是因为:需要遍历全部满足题意的点,是纯粹的深度优先搜索遍历全部可走点)

首先,return的条件是什么?肯定是到终点了,所以肯定需要进行一些操作,比如某个count++,然后return
if条件判断,剪枝优化,毕竟dfs……毕竟递归……能优化尽量优化……
接下来是dfs递归的核心部分:
我们不妨从第0行开始,这时候需要处理的是k个棋子,对第0行遍历,找到一个满足题意的‘#’区域后,我们知道以后这一列都不能用了,我们vis数组可以只建立为一维数组,只存储用过的行就可以,然后深层搜索,即dfs,这时候,我们就要从第1行开始搜索了(正因为这样,vis才不用存储行是否用过的冲突问题),此时需要处理的是k-1个棋子,我们同样是对第1行所有元素都遍历,找‘#’,只不过对于之前vis标记过得那一列,我们也不选用,找到后,再次标记,然后dfs……………………dfs进入第i行,对第i行遍历,当前需要处理的是k-i个棋子的问题,筛掉非棋盘区域和之前标记过得列,找到’#’,标记,然后dfs()………………知道某一次dfs进入后,发现当前处理棋子数量为0,说明到头了,这是找到了一种方法 ,count++,return,假设这是第一次return,那么将返回到第k-1行,继续寻找满足的‘#’,重复…………知道某一次return会到第0行了,那么,将从第1行继续作为dfs的第一次起始,这就相当于改变控制了dfs起始的位置。

以上引用自这位大神的博客 http://blog.youkuaiyun.com/lvxin1204/article/details/51028041

源代码

#include<iostream>
#include<cstring>
using namespace std;
char chess[8][8];
int vis[8];
int count;
int n,k;
void dfs(int a, int b){
    // 从第a行开始,需要处理k个棋子
    if(b==0){
        count++;
        return;
    }
    for(int i=a;i<n;i++){
        for(int j=0;j<n;j++){
            if(chess[i][j]=='#' && vis[j]==0){
                //假如chess[i][j]处是棋盘且该列未被访问过
                vis[j]=1;
                dfs(i+1,b-1);
                vis[j]=0;
            }
        }
    }
}

int main(){
    while(cin>>n>>k && n!=-1 && k!=-1){
        memset(vis,0,sizeof(vis));
        count=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>chess[i][j];
            }
        }
        dfs(0,k);
        cout<<count<<endl;
    }
    return 0;
}
poj 1321 棋盘问题 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29049   Accepted: 14396 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求 阅读详情

相关推荐

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1567

1321 棋盘问题

题目链接 一行一行的搜索,vis标记当前列有没有访问过.如果么有就放在这一行然后标记当前行#include<iostream> #include<vector> #include<cstring> #include<cstdlib>] #include<algorithm> #include<cstdio> using na...

NoahCool 78

从零开始:用Xilinx FPGA实现RISC-V单周期CPU(附完整Verilog代码)

本文详细介绍了如何使用Xilinx FPGA从零开始实现RISC-V单周期CPU,包括开发环境搭建、核心架构设计、Verilog代码实现及功能验证。通过实战指南和完整代码示例,帮助开发者掌握RISC-V CPU设计的关键技术,适用于嵌入式系统和定制化计算场景。

weixin_30664051的博客 547

POJ 1321 棋盘问题

Time Limit:1000MS Memory Limit:10000K Total Submissions:37432 Accepted:18402 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求...

181

Zemax光机热集成分析:从FEA数据导入到光学性能评估实战

在精密光学系统设计中,环境温度变化和机械应力是导致像质恶化的关键因素,这涉及到光、机、热多物理场的耦合分析。其核心原理在于,通过有限元分析(FEA)软件(如ANSYS)模拟热与力学载荷下的结构变形和温度分布,并将这些物理场数据精准映射到光学设计软件(如Zemax)中,以评估其对调制传递函数(MTF)、点列图等核心光学指标的影响。这项技术的工程价值在于,它使设计从静态的理想模型跃升至动态的工程现实,能够在设计阶段就预测并补偿环境扰动,从而显著提升光学系统在航空航天、车载镜头、高功率激光等严苛工况下的可靠性与稳

weixin_30565327的博客 356

AT89C52单片机+LCD屏:手把手教你做一个能算小数和负数的计算器(附完整代码)

本文详细介绍了如何使用AT89C52单片机和LCD1602显示屏构建一个支持小数和负数运算的高精度计算器。从硬件选型、系统架构设计到核心算法实现,提供了完整的代码示例和优化技巧,特别适合51单片机初学者和课程设计参考。

weixin_30374009的博客 370

POJ 1321--棋盘问题

DFS:16ms首先枚举从n行中选择cheeseNum个行的个数,也就是选择棋子的过程中第一行   必须是[0,n-cheeseNum]之间,DFS过程中第二行的开始行数就必须在第一行基   础上加1,同时能有棋子的第二行的最大行数加1。当最大行数为n时,也即是   DFS了cheeseNum层,并且列数无冲突时,结果加一。

dingzuoer的专栏 488

西门子S7-200 SMART 实战解析:滑动平均值滤波算法在模拟量信号处理中的应用

本文详细解析了在西门子S7-200 SMART PLC中实现滑动平均值滤波算法的实战应用。通过处理模拟量信号如温度、压力等,该算法有效抑制信号干扰,提升系统稳定性。文章涵盖算法原理、程序框架、信号采集及调试优化,为工业自动化工程师提供实用指南。

gitlab7runner的博客 1152

【搜索算法】练习一:poj1321 棋盘问题、poj2251 Dungeon Master

文章目录poj1321 棋盘问题1.题目描述2.输入要求3.输出要求4.测试样例5.代码poj2251 Dungeon Master1.题目描述2.输入要求3.输出要求4.题目解释5.测试样例6.代码 poj1321 棋盘问题 题目链接:https://vjudge.net/problem/POJ-1321 1.题目描述   在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可

要像蜗牛一样一步一步往上爬! 1112

【AI Agent】Hermes Agent解析

Hermes Agent:一个具备持久化学习能力的开源AI Agent框架 核心特点: 突破传统Agent的"无状态困境",通过记忆系统(SQLite+FTS5全文检索)实现跨会话经验积累 支持200+模型自由切换,11种模型家族和15+平台接入 五层架构设计(入口层、编排层、推理层、工具执行层、存储层)实现平台无关性 47+内置工具和动态技能沉淀机制,支持从任务执行中自动提炼可复用Skill 独特的四层记忆体系(会话/每日/长期/向量索引)和辩证式用户建模 与传统Agent对比: 具备自我进化能力,通过A

sysu_lluozh 928

1、信息与物理世界:“It from Bit”还是“Bit from It”?

这篇博文探讨了物理学与信息理论之间的深刻联系,从惠勒提出的“It from Bit”概念出发,讨论了信息是否是物质世界的基础,或者物质是否是信息的来源。文章回顾了2013年举办的征文竞赛以及众多学者对这一问题的不同观点,涵盖了量子理论、热力学、计算机科学、黑洞物理以及时空本质等多个领域。同时,文章还分析了信息理论在哲学层面的含义,并展望了其在未来理论、实验和应用研究中的潜力与方向。

water的专栏 289

[POJ - 1321 ]棋盘问题

[POJ - 1321 ]棋盘问题题目阅读搜索部分一般情况退化情况 题目阅读 1.“摆放棋子”->与走迷宫不同的是棋子摆放出的路径并不是连续的,也就是说该步的位置和下一步可能包含上下左右相邻,右上、右下、左上、左下相邻,甚至会出现隔了几行、几列才能放置棋子的情况(根本就不相邻,这是和迷宫题最突出的不同)。 2.“任意的两个棋子不能放在棋盘中的同一行或者同一列”->无疑这是排除了上面情...

lznext的编程日记 1950

ADS基础教程12 - 参数扫描

在硬件设计、仿真以及调试阶段,很多时候需要找到一个合理的参数来使设计处于最优状态。前面所讲的调优方式是其中的最直接的手段。因此,本文将介绍ADS中如何指定元器件的参数为变量,并可以对变量设置相应的约束条件,来实现的变量进行多组参数的仿真结果的展示。在图形显示界面,添加一个Plot,并添加参数结果。此时,结果中会显示出所有的扫描结果。参数扫描的要素包含:新建变量、变量参数设置、扫描模型设置三个方面。如果找不到该图标,在菜单栏单击右键,弹出的对话框将。,弹出的选项卡中,将添加两个变量。点击菜单栏的仿真按钮。

XZ_ZC的博客 8157

百练1321:棋盘问题

1321:棋盘问题 查看提交统计提示提问 总时间限制: 1000ms 内存限制: 65536kB 描述在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 输入输入含有多组测试数据。 每组数据的第一行是两个正整

Charinfield的专栏 538

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

百练1321:棋盘问题题解

1321:棋盘问题 查看提交统计提示提问 总时间限制: 1000ms 内存限制: 65536kB 描述在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 输入输入含有多组测试数据。 每组数据的第一行是两个正整

SigmaHo的专栏 419

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

百练1321:棋盘问题

总时间限制:1000ms内存限制:65536kB描述在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。输入输入含有多组测试数据。每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n...

weixin_30249203的博客 155

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【深搜题目】百练 2815 城堡问题,poj 1190 搭蛋糕 poj1321 棋盘问题

目录 城堡问题 POJ—1190 搭蛋糕 poj1321 棋盘问题 城堡问题 题目链接:http://bailian.openjudge.cn/practice/2815/ 描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | ...

an94460061的博客 368

poj 1321 棋盘问题 题解

棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30740   Accepted: 15208 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对

SDUTACM的博客 2945

POJ 1321 棋盘问题【从头练dfs】

链接:  http://poj.org/problem?id=1321 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#problem/D 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Su

free斩 1397

棋盘问题 POJ - 1321

https://vjudge.net/problem/POJ-1321 棋盘问题 POJ - 1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 Input 输入含有多组测试数据。 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 当为-1 -

Are_you_ready的博客 363

《POJ 1321 - 棋盘问题》的题解

《A - 棋盘问题》的题解 题目的描述 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 Input 输入含有多组测试数据。 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n &l...

weixin_46163391的博客 646

POJ 1321 棋盘问题

棋盘问题 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有

dlj1713779797的博客 5102

POJ——1321棋盘问题

文章目录POJ1321棋盘问题题目思想代码 POJ1321棋盘问题 题目 http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 99960 Accepted: 45560 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行

李霁明的博客 300

POJ-1321 棋盘问题

POJ-1321 棋盘问题 题目链接:POJ-1321 题目大意:给定一个棋盘 棋盘#的位置可以放置棋子 要求你放入k个棋子 并且放过棋子的同一行同一列不能再放棋子 问有多少种放法 解题思路:将可以设置棋子的地方放入一个容器中 之后递归往下看能不能放即可,当然还要试试当前要放的位置横行和列数有没有放过 当放k个棋子的时候总数加一 最后输出即可 这题时间要求挺苛刻的吧 最大行列数的时候我的递归基本...

鱼头的水题之路 230

POJ 1321 棋盘问题(C)回溯

POJ,1321,棋盘问题,C,回溯,棋子,递归,方案数,形状,棋子数,string.h,memset,TRUE,FALSE,二维数组,getchar,题目链接,题解,代码,截图,提交结果。

wowpH 344
上一篇: POJ 3669 Meteor Shower
下一篇: 百练 1745: Divisibility
coding_sun
博客等级 码龄10年 10粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值