深搜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 ...
随机推荐
- 基于FBX SDK的FBX模型解析与加载 -(四)
8. 骨骼蒙皮动画 骨骼蒙皮动画是当前游戏引擎中最常用的一种动画方式,关于其基本原理网络上的资料较多,关于到涉及的其它较复杂操作,如插值.融合等在这里也就先不再讨论了,而且其实现方式也与具体引擎的动作 ...
- Unity陀螺仪
using UnityEngine; using System.Collections; using UnityEngine.UI; //摄像机 陀螺仪转动 public class TGyro : ...
- SpringSercurity基础
创建 spring 配置文件 spring-security.xml intercept-url 表示拦截页面 /* 表示的是该目录下的资源,只包括本级目录不包括下级目录 /** 表示的是该目 ...
- iOS UITableView reloadData 刷新结束后执行后续操作
如果在reloadData后需要立即获取tableview的cell.高度,或者需要滚动tableview. 如果直接在reloadData后执行代码是有可能出问题的,比如indexPath为nil等 ...
- Hexo瞎折腾系列(4) - 站点首页不显示文章全文
文章摘要设置 打开主题配置文件 _config.yml 文件,找到如下: # Automatically Excerpt. Not recommend. # Please use <!-- mo ...
- 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- Maven聚合模式
项目的打包类型:pom.jar.war 项目中一般使用maven进行模块管理,每个模块下对应都有一个pom文件,pom文件中维护了各模块之间的依赖和继承关系.项目模块化可以将通用的部分抽离出来,方便重 ...
- php中三元运算符用法
代码如下: <?php $handle=fopen("../good/html/1.txt", "r"); while(!feof($handle)) / ...
- 数字(number)
数字(number) Time Limit:2000ms Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...
- poj2377 Bad Cowtractors
思路: 最大生成树. 实现: #include <iostream> #include <cstdio> #include <vector> #include &l ...