POJ-1321

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

Input

输入含有多组测试数据。 
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 
当为-1 -1时表示输入结束。 
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 

Output

对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

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的更多相关文章

  1. 图的遍历 之 深搜dfs

    DFS 遍历 深度优先搜索是一个递归过程,有回退过程. 对一个无向连通图,在访问图中某一起始顶点u 后,由u 出发,访问它的某一邻接顶点v1:再从v1 出发,访问与v1 邻接但还没有访问过的顶点v2: ...

  2. HDU 2553 N皇后问题(深搜DFS)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. 深搜(DFS),Image Perimeters

    题目链接:http://poj.org/problem?id=1111 解题报告: 1.这里深搜有一点要注意,对角线上的点,如果为'.',则total不应该增加,因为这不是他的边长. #include ...

  4. 深搜(DFS),回溯,Fire Net

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 解题报告: 这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每 ...

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. 【深搜(DFS)-例题-踏青】-C++

    描述 小白和他的朋友周末相约去召唤师峡谷踏青.他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地.草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都 ...

  7. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  8. HDU 2614 Beat 深搜DFS

    这道题目还是比较水的,但是题意理解确实费了半天劲,没办法 谁让自己是英渣呢! 题目大意: 猪脚要解决问题, 他有个习惯,每次只解决比之前解决过的问题的难度要大. 他给我们一个矩阵  矩阵的 i 行 j ...

  9. noj电子老鼠走迷宫(深搜dfs)超时错误

    1042.电子老鼠闯迷宫 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 有一只电子老鼠被困在如下图所示的迷宫中.这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色 ...

  10. poj1321 棋盘问题(深搜dfs)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/prob ...

随机推荐

  1. python 闭包 闭包与装饰器之间的关系

    一.一个闭包的实际应用例子 def func(a, b): def inner(x): return a * x + b return inner inn = func(1, 1) print(inn ...

  2. CCF2016.4 - C题

    思路:先把路径按反斜杠split成数组,然后用一个ArrayList去模拟.如果遇到空或者.则不处理:如果遇到..则删除ArrayList最后一个元素(注意如果只有1个元素则不删除):其他情况直接加到 ...

  3. NOIp2017真题模拟赛 By cellur925

    果然我还是最菜的==不接受反驳 (先考了day2喵喵喵) Day2 T1:奶酪 期望得分:100分 实际得分:100分 考察:并查集 思路:这题其实之前做过了==.思路还是比较清晰的,读入时预处理出可 ...

  4. Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)

    题目链接: Hdu 5446 Unknown Treasure 题目描述: 就是有n个苹果,要选出来m个,问有多少种选法?还有k个素数,p1,p2,p3,...pk,结果对lcm(p1,p2,p3.. ...

  5. Android课程设计第六天欢迎界面(跳转)

    注意:课程设计只为完成任务,不做细节描述~ package com.example.myapplication; import android.app.Activity; import android ...

  6. A Dangerous Maze LightOJ - 1027

    这题意真是... 题意:你在一个迷宫里,有一些门,每个门有一个参数x,如果为正表明你进入门后可以花x的时间出去,如果为负表明你进入门后可以花-x的时间回到出发的地方.每次回到出发的地方之后,不能记得之 ...

  7. Contextual Action bar(2) 简介,启动,各函数介绍

    一.Context Action Bar简介 它是一个ActionBar,有各种操作项,但它不是始终显示的ActionBar,它需要上下文才显示.样式如下: 二.Context Action Bar的 ...

  8. ForeignKeyConstraint 外键约束的使用及作用的学习[转]

    原文链接 da.SelectCommand.CommandText="select au_id,au_fname,au_lname from authors"; da.Fill(d ...

  9. [已读]JavaScript编程精解

    译者汤姆大叔,应该很多人都知道,他写了一系列的关于闭包与作用域理解的文章,但是由于创建了一些我不理解的新名词,我不爱看. <JavaScript编程精解>算是买得比较早的一本书,那会大肆搜 ...

  10. qconbeijing2014

    http://2014.qconbeijing.com/videoslides.html   周一 周二 周三 周四 周五 周六 2014年5月19日 Deep Dive into Amazon's ...