题目链接:http://poj.org/problem?id=1321

Time Limit: 1000MS Memory Limit: 10000K

Description

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

可以说是非常经典的一道DFS题目了,不说有多难,但是可以很好地体现出DFS的思想。

对于一个n*n的棋盘,我们考虑按行进行DFS,一行一行往下推进就类似于DFS一层一层往下搜索。

对于函数dfs(int row,int num),row表示当前进行到哪一行,num代表到目前为止,棋盘上已经放了多少棋子了。

那么,在dfs()这个函数中,显然要对row这行上的每一格进行一次遍历(一次for循环);

遍历的过程中,遇到能放棋子的格子(两个要求:①这一格确实是属于棋盘的 map[i][j]='#' ;  ②这一列上,上面那几行没有放过棋子 vis[col]==0 ),那就不管了,先放上去再说;

那么我们放了一颗棋子之后,这行就不能再放了,那就往下走一行dfs(row+1,num+1);

那么我们dfs(row+1,num+1)这个做完了之后呢?

显然,我们又不是一定要往这个格子上放旗子,棋盘这么大我想去看看,所以我们要把之前放下的那颗棋子拿起来,继续在row这行上继续遍历,寻找下一个能放棋子的格子;

最后我如果把这一行全部遍历完了呢?我们是不是非得往这行上放棋子?

当然不是啦

如果棋子少,这行不放也是可以的呀,所以在一次for循环结束之后,我们也要往下一行走,即dfs(row+1,num)。

这就是大体上的DFS思路啦,更多细节请详见代码:

 #include<cstdio>
#include<cstring>
char map[][];
int n,k,ans;
bool colvis[];
void dfs(int row,int num)
{
if(num==k)//全部chess都已经放完啦!
{
ans++;//方案数+1
return;
}
if(row>n) return;
for(int col=;col<=n;col++)
{
if(map[row][col]=='#' && !colvis[col])
{
colvis[col]=;
dfs(row+,num+);
colvis[col]=;
}
}
dfs(row+,num);
}
int main()
{
while(scanf("%d%d",&n,&k) && n!=-)
{
memset(colvis,,sizeof(colvis));
memset(map,,sizeof(map));
for(int i=;i<=n;i++) scanf("%s",map[i]+);
ans=;
dfs(,);
printf("%d\n",ans);
}
}

泼妇爱科特!!!

POJ 1321 - 棋盘问题 - [经典DFS]的更多相关文章

  1. poj 1321 棋盘问题 简单DFS

    题目链接:http://poj.org/problem?id=1321 很久没有敲搜索了啊,今天敲了个水题练练手,哈哈.... 题目大意: 就是求在n*n的方格上放置k个棋子的方案数 代码: #inc ...

  2. POJ - 1321 棋盘问题 【DFS】

    题目链接 http://poj.org/problem?id=1321 思路 和N皇后问题类似 但是有一点不同的是 这个是只需要摆放K个棋子就可以了 所以 我们要做好 两个出口 并且要持续往下一层找 ...

  3. POJ 1321 棋盘问题(dfs)

    传送门 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38297   Accepted: 18761 Descri ...

  4. poj 1321 棋盘问题【dfs】

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28308   Accepted: 13996 Descriptio ...

  5. poj 1321 棋盘问题 (DFS深度优先搜索)

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

  6. POJ 1321 棋盘问题 (dfs)

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

  7. POJ 1321 棋盘问题【DFS/回溯/放与不放/类似n皇后】

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62164 Accepted: 29754 Description 在一 ...

  8. POJ——1321棋盘问题(DFS+回溯)

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33272 Accepted: 16456 Description 在一 ...

  9. 题解报告:poj 1321 棋盘问题(dfs)

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

随机推荐

  1. shouldComponentUpdate 是做什么的,(react 性能优化是哪个周期函数?)

    shouldComponentUpdate询问组件是否需要更新的一个钩子函数,判断数据是否需要重新渲染,返回一个布尔值.默认的返回值是true,需要重新render().若如果返回值是false则不触 ...

  2. python 过滤文本中的标点符号(转)

    网上搜到的大都太复杂,最后找到一个用正则表达式实现的: import re s = "string. With. Punctuation?" # 如果空白符也需要过滤,使用 r'[ ...

  3. 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=i5j7gwrxj9x5

    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=i5j7gwrxj9x5

  4. 获取当前网页的绝对URL地址

    通过创建一个虚拟的<a></a>元素,将它的href指定为相对URL,再读取它的href就会得到绝对URL. var getAbsoluteUrl = (function() ...

  5. Lucene与Solr基础

    SolrSelectTest 查询与删除 package com.snow.solr; import com.snow.bean.Product; import org.apache.solr.cli ...

  6. 【C++】C++中的数组

    目录结构: contents structure [-] 一维数组 数组的定义和初始化 数组元素的访问 数组和指针 多维数组 数组是存放相同类型的容器,数组的大小确定不变,不能随意向数组中添加元素.因 ...

  7. IDEA使用笔记(十一)——好玩的类图结构

    今天使用 IntelliJ IDEA 发现一个好玩的操作,尤其对于研究源码了解类的层级关系有非常大的帮助! 1:先看效果 1-1:HashSet的类图结构——继承什么类.实现什么接口一目了然 1-2: ...

  8. Netty学习(八)-Netty的心跳机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a953713428/article/details/69378412我们知道在TCP长连接或者Web ...

  9. Linux Shell函数返回值

    转:http://blog.csdn.net/ithomer/article/details/7954577 Shell函数返回值,一般有3种方式:return,argv,echo 1) return ...

  10. 同一个tomcat下面放多个项目 每个项目用不同的域名访问

    vim ./conf/server.conf <Host name=" appBase="/www/test1/webapps" ##这是war包存放的位置 unp ...