深搜DFS
POJ-1321
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
#include<cstdio>
#include<cstring> const int maxn=; char board[maxn][maxn]; //记录棋盘状态
int place[maxn]; //记录一列是否已经放过棋子
int n,k;
int cnt,num; //cnt 是放棋子的方案数 ,num是已放棋子数目 void DFS(int i){
if(num==k){
cnt++;
return ;
}
if(i>=n)
return ;
for(int j=;j<n;j++) {
if(!place[j] && board[i][j]=='#'){
place[j]=;
num++;
DFS(i+);//cnt计数操作
place[j]=;
num--;
}
}
DFS(i+); //i行不放棋子,进入下一行操作
} int main(){ //freopen("input.txt","r",stdin); int i,j;
while(scanf("%d%d",&n,&k)){
getchar();
if(n==- && k==-)
break;
for(i=;i<n;i++){
for(j=;j<n;j++)
scanf("%c",&board[i][j]);
getchar();
}
memset(place,,sizeof(place));
cnt=;
num=;
DFS();
printf("%d\n",cnt);
}
return ;
}
对于这个问题,怎说呢,对于初学者来说还是有难度的,因为搞不清楚递归函数的入口和出口,很容易弄混淆。
这里先说一下大体的思路吧,对于上边的那个四四的棋盘来说,首先从1 4进去,然后再在1 4里面进入2 3,然后进入3 2,然后进入4 1,然后从num的判断条件返回,cnt++。
凡是从num返回的都是可行的方案,因为棋子数达到了最大,而且是在满足题目要求的条件下。所以num返回才是正道。而从n的判断条件返回的就都不是什么好货了。因为当从n返回的时候,i都是大于n的,这是因为上一行已经不放棋子了,所以后面无论怎么放,都不可能放下。
也就是说,从1 4 进去这条路的意思是,先确定1 4,然后接着确定其它的棋子位置,但是这条路走完之后,第一行已经无立锥之地放棋了,所以,接着又进入2 3,顺着 2 3进入 3 2,然后是 4 1,从n返回。这时候判断的就是第一行不放棋子,然后让后几行放入棋子的情况。这样的话,肯定是不会满足条件的。
之后顺次进入第三行第四行,然后第五行退出。
细说的话,实际上刚才已经将清楚了,现在一行里面判断一轮,能放棋的地方都是一条路。这里可以模拟一下一行有两块棋盘的情况,当有两块棋盘的时候,你就会发现place在这里的作用了,因为只有!place【j】满足的条件下才能进入对这一条路的判断,虽然这一条路可以放两个棋子,但是你会发现这抵触了题目的条件,单行单列单棋子。就这样。
深搜DFS的更多相关文章
- 图的遍历 之 深搜dfs
DFS 遍历 深度优先搜索是一个递归过程,有回退过程. 对一个无向连通图,在访问图中某一起始顶点u 后,由u 出发,访问它的某一邻接顶点v1:再从v1 出发,访问与v1 邻接但还没有访问过的顶点v2: ...
- HDU 2553 N皇后问题(深搜DFS)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 深搜(DFS),Image Perimeters
题目链接:http://poj.org/problem?id=1111 解题报告: 1.这里深搜有一点要注意,对角线上的点,如果为'.',则total不应该增加,因为这不是他的边长. #include ...
- 深搜(DFS),回溯,Fire Net
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 解题报告: 这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每 ...
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- 【深搜(DFS)-例题-踏青】-C++
描述 小白和他的朋友周末相约去召唤师峡谷踏青.他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地.草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都 ...
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
- HDU 2614 Beat 深搜DFS
这道题目还是比较水的,但是题意理解确实费了半天劲,没办法 谁让自己是英渣呢! 题目大意: 猪脚要解决问题, 他有个习惯,每次只解决比之前解决过的问题的难度要大. 他给我们一个矩阵 矩阵的 i 行 j ...
- noj电子老鼠走迷宫(深搜dfs)超时错误
1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色 ...
- poj1321 棋盘问题(深搜dfs)
转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/prob ...
随机推荐
- 51nod 1428【贪心】
思路: 就是先排序,然后对每个取最小的结束时间. #include <bits/stdc++.h> using namespace std; typedef long long LL; c ...
- Educational Codeforces Round 12 A. Buses Between Cities
题意: 从A到B的汽车每隔 a 分钟发车一次,从A到B要ta分钟. 从B到A汽车每隔b分钟发车一次,从B到A要ta分钟. Simion从A出发,问他在A->B的途中共遇到了多少辆车. 汽车都是从 ...
- bzoj 2761: [JLOI2011]不重复数字【hash】
map会T,双hash会冲突--于是非酋写了个三hash #include<iostream> #include<cstdio> #include<cstring> ...
- IT兄弟连 JavaWeb教程 Servlet中定义的变量的作用域类型
在Java语言中,局部变量和实力变量有着不同的作用于,它们的区别如下: 局部变量在一个方法中定义,每当一个线程执行局部变量所在的方法时,在线程的堆栈中就会创建这个局部变量,当线程执行完该方法,局部变量 ...
- Nginx的location配置概述【转】
语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可.nginx不对url做编码,因此请 ...
- Linux下rpm、yum和源码三种安装方式详细介绍
第1章 源码安装 源码包安装会比RPM包安装慢,是因为RPM的软件包是根据特定系统和平台而指定的,经常一种 程序会提供很多RPM包的格式,用户根据系统情况选择适合的RPM包直接安装,而源码包相当于 通 ...
- ulimit资源配置
基本理解 linux对每个用户能使用的系统资源有一定限制.如果没有限制,在多用户登录,并且都消耗大量资源时,对系统产生复杂的影响.ulimit内建一套参数,来规定一个用户能使用多少资源. [root@ ...
- UVa 11437 (梅涅劳斯定理) Triangle Fun
题意: 给出三角形ABC顶点的坐标,DEF分别是三边的三等分点.求交点所形成的三角形PQR的面积. 分析: 根据梅涅劳斯定理,我们得到: ,解得 另外还有:,解得 所以AR : RP : PD = 3 ...
- LIS 2015百度之星初赛2 HDOJ 5256 序列变换
题目传送门 题意:中文题面 分析:LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载)加入序列是1,2,2,2,3,这样求上升子序列是3,也就是 ...
- 147 Insertion Sort List 链表插入排序
用插入排序对链表进行排序. 详见:https://leetcode.com/problems/insertion-sort-list/description/ Java实现: 链表的插入排序实现原理很 ...