003:棋盘问题

总时间限制: 1000ms 内存限制: 65536kB

描述

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

解题思路:

逐行DFS
1.建立chess数组将棋盘放入
2.建立visited数组标记已经排放棋子的列数

DFS函数的终止条件:
1.k个棋子都已摆放完——成功终止
2已摆放到最后一行——终止

摆放棋子的条件:
1.该列未摆放过棋子
2.该行未摆放过棋子

遍历这一行的每一列直到找到:
每一行的第i列都没有棋子 && 这一行的第i列 == ‘#’
故用visited数表示有棋子的列
用chess数组来存储每一个位置的符号

#include<iostream>
#include<cstring>
using namespace std;int n,k;   //长n,宽n、 摆放k个棋子
//         #表示棋盘区域、 .表示空白区域char chess[10][10];
int visited[10];      //被放置的列
int Sum=0;
void Dfs(int h,int count){   //count用于统计此时已摆放的棋子数
//h代表正在摆放的行数if (count==k) {     //k个棋子都已摆放——摆放数目+1,退回上层尝试其他摆法Sum++;return;}if(h>=n)      //正在摆放的行数超出棋盘行数————终止return;for (int i=0;i<n;i++){      //遍历h行的每一列 if(!visited[i]&& chess[h][i]=='#')   //h行未被放置且找到为'#'的位置                                              {//且i列也未被放置visited[i]=1;Dfs(h+1,count+1);       //若返回则表明摆在该列已尝试完成//把该列的访问记录撤销,尝试摆在下一列; visited[i]=0;//还原} }  //当h行所有字符都不满足条件时——搜索下一行 Dfs(h+1,count);
}int main(){while(cin>>n>>k&&n != -1&&k != -1){for(int i = 0; i < n; i++)for(int j = 0 ; j < n; j++)cin>>chess[i][j];Sum =  0;     //别忘记每次都要初始化,这是多样例题。Dfs(0,0);        //从第一行开始深搜。cout<<Sum<<endl;}return 0;
}

DFS 003:棋盘问题相关推荐

  1. (DFS)棋盘问题(poj1321)

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

  2. bfs dfs 搜索入门模板题

    bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...

  3. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  4. CCF认证训练行动路线图

    通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...

  5. 初学者acm的练习题指南

    上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1.    <!--[endif]-->Programming Bas ...

  6. sicily题目分类

    sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...

  7. [sicily]部分题目分类

    sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...

  8. Sicily 题目分类

    依照自己水平挑着做→ →~~ 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 ...

  9. 编程题目分类(剪辑)

    1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代 ...

最新文章

  1. 我的业务要不要用人工智能?引入AI前你需要评估的(二)
  2. 读取手柄_中高端游戏手柄比选,北通宙斯才是游戏的最佳拍档
  3. java 容器限制大小,容器中的Java与内存限制:LXC、Docker与OpenVZ
  4. 同步、异步 与 串行、并行的区别
  5. ssm 使用中的一些问题
  6. 2011阿里巴巴集团实习生招聘笔试题 CC++
  7. 《机器学习导论》和《统计机器学习》学习资料:张志华教授
  8. 一个女程序员征男友的需求说明书
  9. Leetcode1512. 好数对的数目 抽出本质原型 利用范围条件
  10. Spark Structured SQL报错:Stream stream joins without equality predicate is not supported
  11. mysql sql 多选项_Mysql-Sqlalchemy-多表操作
  12. 无线网络(4) 无线网络基本工作原理
  13. sqlite3 not found问题解决方法
  14. go tcp socket
  15. java.lang.Runtime 运行时类 执行 dos 、cmd 命令、VBS 脚本
  16. Manjaro Linux 相关初始化
  17. 计算机视觉方向开题,机器视觉开题报告.doc
  18. Spring DI和AOP简介(一)
  19. 数据库大作业-电影院管理系统
  20. Matlab-simulink汽车二自由度模型

热门文章

  1. APISpace 人像比对API
  2. ABAQUS均匀受力,边界条件对称,但结果云图不对称
  3. 类脑计算芯片作为基础前沿技术重大突破成果,荣登CCTV《新闻联播》
  4. SQL面试题练习记录
  5. 使用Ionic.Zip压缩、分卷压缩、解压文件
  6. 2022-2027(新版)中国生物素酰三肽-1行业发展动态与投资趋势预测报告
  7. sgfdgfadsg
  8. hdu4322 candy 费用流
  9. HTTP请求数据格式及响应数据格式
  10. java 月份间隔_java计算两个日期之间相隔的月份(向下取整)