首页 > 其他分享 >1.棋盘问题(简单搜索)

1.棋盘问题(简单搜索)

时间:2023-05-01 22:33:06浏览次数:45  
标签:cnt int 摆放 棋子 搜索 dfs 简单 棋盘

棋盘问题

↑ 题目链接

题目

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

输入格式

输入含有多组测试数据。

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

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

输出格式

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

数据范围

\(n≤8,k≤n\)

输入样例:

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

输出样例:

2
1

思路

数据范围 \(n≤8\) ,暴力枚举即可。从上到下,从左到右枚举棋子摆放的位置,判断这个位置是否属于棋盘区域以及行列有没有放过棋子

代码

#include<bits/stdc++.h>
using namespace std;
const int N=10;
char g[N][N];
bool col[N],row[N];
int n,k;
int ans;


void dfs(int u,int cnt)
{
    if(u>n)return ;
    if(cnt==k)//摆放了k个棋子
    {
        ans++;
        return;
    }
    
    dfs(u+1,cnt);//不选当前格子
    for(int i=0;i<n;i++)
    {
        if(g[u][i]=='#'&&!row[u]&&!col[i])
        {
            row[u]=col[i]=true;//所在行列被占用
            g[u][i]='.';
            dfs(u+1,cnt+1);//选当前格子
            g[u][i]='#';
            row[u]=col[i]=false;//恢复现场
        }
    }
}
int main()
{
	while(cin>>n>>k,n!=-1&&k!=-1)
	{
		ans=0;
		for(int i=0;i<n;i++)cin>>g[i];
		dfs(0,0);
		
		cout<<ans<<endl;
	}
	return 0;
}

标签:cnt,int,摆放,棋子,搜索,dfs,简单,棋盘
From: https://www.cnblogs.com/zzmxj/p/17367126.html

相关文章

  • pyqt5-文本框搜索功能
    1、介绍作用是对一个文本框组件的文本进行搜索,将搜索结果在文本框中进行字体颜色标记,允许re或者普通文本搜索,支持上一个或下一个的跳转,支持标签显示当前索引和总个数。2、ui3、代码(1)自定义search.py,其中包含两个重要的函数"""搜索算法返回结果是list,元素是二元list,表示......
  • 电动机的简单仿真
    Multisim做电子电路仿真,是很不错的.其实,在电气设计方面,也很顺手的.电气设计中,少不了对电动机的驱动,而最常用的便是异步鼠笼式式电动机.虽然可以使用相量法计算,但委实繁琐,而直接进行仿真,则可以减少不少麻烦,并降低出错的概率.所以,在Multisim中画出电动机的等效电路,就可......
  • 在ScrollView添加一个ListView造成的滚动问题的简单解决办法
    已不推荐!推荐:http://gundumw100.iteye.com/blog/1732987正常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把ListView的layout_height改成400dip,而不是用match_parent和wrap_content,我发现这样的话ListView就显示的多了很......
  • 简单位移动画TranslateAnimation
    已不再推荐补间动画,请使用属性动画;动画中的View的点击判断Android动画框架详解http://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt1/index.html每次点击往前100或往后100.packagecom.ql.app;importandroid.app.Activity;importa......
  • 堆与二叉搜索树学习笔记
    部分内容来自OI-WIKI。1.堆堆的定义堆是一棵二叉树,满足每个节点的键值都大于等于它的父亲节点或者小于等于它的父亲节点。每个节点的键值都大于等于它的父亲节点的叫小根堆,每个节点的键值都小于等于它的父亲节点的叫大根堆。优先队列是一种抽象数据类型,它是一种容器,里面有......
  • matlab学习2(数据预处理、简单线性规划)
    1.matlab导入数据注意事项:记得保存数据,清空工作区或者关闭matlab后数值就没有了。2.数据预处理清理缺失值实时编辑器-->任务-->清理缺失数据处理异常值:实时编辑器-->任务-->清理离群数据例子:x=1:100;%构造一个数组,元素为1,2,...,100%randn(1,100)生成1行100列矩......
  • Python中django的ORM和SQLalchemy简单对比(一)
    1.ORM对象关系映射(英语:ObjectRelationMapping,简称ORM,或O/RM,或O/Rmapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。一般的ORM包括以下四部分:一个对持久类对象......
  • Nginx 入门实战(2)--简单使用
    本文主要介绍Nginx的实际使用,文中所使用到的软件版本:Centos7.9.2009、Nginx1.22.1。1、环境准备这里主要演示使用Nginx代理Http及TCP应用,环境信息如下:主机用途Http端口TCP端口10.49.196.30部署Http、TCP应用8080909010.49.196.31部署Http、TCP......
  • SAP 简单采购会计凭证记录
    ME21NMIROMIGO清帐 查看会凭证        ......
  • gdb---简单脚本示例
    gdb---简单脚本示例gdb脚本可批量执行命令,自动化控制调试过程新建文件a.gdb,内容如下:#Thisisacomment.filea.outstartbreak*0x55555555502Ebreak*0x555555555A5Abreak*0x555555555660break*0x555555555714continuedelete*使用方法:gdb-xa.gdb2019/1......