题解报告:poj 1321 棋盘问题(dfs)
Description
Input
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n ,当为-1 -1时表示输入结束。随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
Sample Input
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
解题思路:摆放k个棋子,行列上至多只有1个棋子并且其只能放在'#'位置上,求可行的方案数。借用N皇后思想,用一个一维数组col_pl来标记每列上是否已经摆放了一个棋子,然后递归到每一行时查看该行的每一列是否还有没摆放棋子,并且该位置是'#',如果没有,返回到上一个状态去深搜下一列,否则k--,同时到下一行进行深搜,如果k减到0时,说明此时有一种合理方案,计数器就加1,然后返回到上一个状态位置,继续深搜下一列,边界条件是如果row==n,则直接返回到上一个状态。
AC代码:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int n,k,cnt,num;char mp[][],col_pl[];//col_pl标记每一列是否已放置了一个棋子
void dfs(int row,int num){
if(row==n||num==){//边界条件row(行)递增到n
if(num==)cnt++;//如果num值减为0,则计数器加1
return;//都返回到上一层
}
for(int col=;col<n;++col){//枚举每一列
if(mp[row][col]=='#'&&!col_pl[col]){//如果该位置是'#'并且所在列还没放置一个棋子
col_pl[col]=;//将所在列标记为1,表示该列已为使用状态
dfs(row+,num-);//进入下一行深搜,同时num的个数减1
col_pl[col]=;//回溯时重新标记当前位置为没有使用状态(因为该行可能还有'#',避免对所在行剩下的列造成影响),回溯到上一个状态,去深搜下一列位置
}
}
dfs(row+,num);//如果某一行没有'#',那么就会跳过上面的for循环,为避免此时回溯不能放置剩下的棋子,num应保持不变,然后进入下一行深搜
return;
}
int main(){
while(cin>>n>>k&&(n+k)!=-){
for(int i=;i<n;++i)cin>>mp[i];
for(int row=;row<n;++row)col_pl[row]=;//全部初始化为0,表示该列没有放置棋子
cnt=;//合理方案数置为0
dfs(,k);//从第0行开始,摆放k个棋子
cout<<cnt<<endl;
}
return ;
}
题解报告:poj 1321 棋盘问题(dfs)的更多相关文章
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- POJ 1321 棋盘问题 dfs 难度:0
http://poj.org/problem?id=1321 注意是在'#'的地方放棋子 矩阵大小不过8*8,即使是8!的时间复杂度也足以承受,可以直接dfs求解 dfs时标注当前点的行和列已被访问, ...
- POJ 1321 棋盘问题 (DFS + 回溯)
题目链接:http://poj.org/problem?id=1321 题意:中文题目,就不多说了...... 思路: 解题方法挺多,刚开始想的是先从N行中选择出来含有“#”的K行,再在这K行中放置K ...
- POJ 1321 棋盘问题 DFS 期末前水一水就好……
A - 棋盘问题 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 47960 Accepted: 23210 Descriptio ...
- POJ 1321 棋盘问题 DFS搜索
简单搜索 练习一下回溯 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- DFS POJ 1321 棋盘问题
题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...
- POJ 1321 棋盘问题(C)回溯
Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...
随机推荐
- [K/3Cloud] 如何代码中动态设置当前活动页签
this.GetControl<TabControl>(key).SelectedIndex=目标Index Ps:如下方式隐藏页签: this.View.GetControl(" ...
- 使用Spring-Session共享使用Session
前言: session共享策略有很多,常见的有粘性复制,高并发下效率查.tomcat-redis-session-manager无疑是一个挺好的方案,缺点要配置tomcat,有点复杂.最优的方案莫过于 ...
- JS前端取得并解析后台服务器返回的JSON数据的方法
摘要:主要介绍:使用eval函数解析JSON数据:$.getJSON()方法获得服务器返回的JSON数据 JavaScript eval() 函数 eval(string) 函数可计算某个字符串,并执 ...
- codevs3285 转圈游戏
题目描述 Description n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...
- 【http_load】http_load性能测试工具使用详解
1.什么是http_loadhttp_load是一款基于Linux平台的web服务器性能测试工具,用于测试web服务器的吞吐量与负载,web页面的性能. 2.http_load的安装1)下载地址wge ...
- csu - 1537: Miscalculation (模拟题)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1537 因为给出的式子是必定合法的,只要用两个栈分别保存符号和数字.算出答案后和从左至右算的答案比对 ...
- ThinkPHP3.2 点击看不清刷新验证码
欢迎使用Markdown编辑器写博客 baidu了一下.发现没有可用的源码,自己想了想,以下的方法可行. <!DOCTYPE html> <html> <head> ...
- RHEL6.5上Oracle ACFS与Linux samba一起使用时遇到的bug
RHEL上的Oracle ACFS与linux samba一起使用时遇到的bug 一.环境介绍: cat /etc/issue的结果为: Red Hat Enterprise Linux Server ...
- 二叉查找树(BST)
二叉查找树(BST) 二叉查找树(Binary Search Tree)又叫二叉排序树(Binary Sort Tree),它是一种数据结构,支持多种动态集合操作,如 Search.Insert.De ...
- RELU 激活函数及其他相关的函数
RELU 激活函数及其他相关的函数 转载 2016年07月21日 20:51:17 45778 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 更多相关博客 ...