DFS 003:棋盘问题
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:棋盘问题相关推荐
- (DFS)棋盘问题(poj1321)
题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放 ...
- bfs dfs 搜索入门模板题
bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...
- ACM题集以及各种总结大全(转)
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- CCF认证训练行动路线图
通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...
- 初学者acm的练习题指南
上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1. <!--[endif]-->Programming Bas ...
- sicily题目分类
sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...
- [sicily]部分题目分类
sicily题目分类 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. ...
- Sicily 题目分类
依照自己水平挑着做→ →~~ 1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 ...
- 编程题目分类(剪辑)
1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代 ...
最新文章
- 我的业务要不要用人工智能?引入AI前你需要评估的(二)
- 读取手柄_中高端游戏手柄比选,北通宙斯才是游戏的最佳拍档
- java 容器限制大小,容器中的Java与内存限制:LXC、Docker与OpenVZ
- 同步、异步 与 串行、并行的区别
- ssm 使用中的一些问题
- 2011阿里巴巴集团实习生招聘笔试题 CC++
- 《机器学习导论》和《统计机器学习》学习资料:张志华教授
- 一个女程序员征男友的需求说明书
- Leetcode1512. 好数对的数目 抽出本质原型 利用范围条件
- Spark Structured SQL报错:Stream stream joins without equality predicate is not supported
- mysql sql 多选项_Mysql-Sqlalchemy-多表操作
- 无线网络(4) 无线网络基本工作原理
- sqlite3 not found问题解决方法
- go tcp socket
- java.lang.Runtime 运行时类 执行 dos 、cmd 命令、VBS 脚本
- Manjaro Linux 相关初始化
- 计算机视觉方向开题,机器视觉开题报告.doc
- Spring DI和AOP简介(一)
- 数据库大作业-电影院管理系统
- Matlab-simulink汽车二自由度模型