一、题目回顾

题目链接:棋盘问题

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
  • 复习题

我采用的是按行递增的顺序来搜索的,因此不可能出现同行的情况,对于同列的情况,我设置了一个数组col[],来保存列的访问状态,对于之前访问过的列,棋子是不能再放在这一列上的。

dfs(cow) 代表将首枚棋子放在第row行。

三、代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; int n,k,m; //k:要放置的棋子数 m:棋盘上已放置的棋子数
int ans; //方案数
char a[][];
int col[]; //记录第几列是否被访问
void dfs(int row) //第一枚棋子放在第row行
{
if(k==m){ //棋子全放在棋盘上
ans++;
return;
}
if(row>n) return;
for(int j=;j<=n;j++){
if(a[row][j]=='#' && !col[j]){
col[j] = ;
m++;
dfs(row+);
col[j] = ; //改回来方便下一行的判断
m--; }
}
dfs(row+); //一种方案结束,开始下一种方案
} int main()
{
while(scanf("%d%d",&n,&k)){
if(n==- && k==-) break;
for(int i=;i<=n;i++){
getchar();
for(int j=;j<=n;j++){
scanf("%c",&a[i][j]);
}
}
getchar();
memset(col,,sizeof(col));
ans = ;
m = ;
dfs(); //第一种方案将首枚棋子放在第一行
printf("%d\n",ans);
}
return ;
}

DFS(3)——poj1321棋盘问题的更多相关文章

  1. 简单的dfs题 --- POJ1321 棋盘问题

    题目链接: http://poj.org/problem?id=1321 题目大意: 你有k个棋子,若干个可以填的位置,要求填下一个棋子后其行和列不能填棋子. 思路: dfs策略 画图理解更好些: 填 ...

  2. poj1321 棋盘问题(DFS)

    题目链接 http://poj.org/problem?id=1321 题意 给定一块棋盘(棋盘可能是不规则的),有k个相同棋子,将k个棋子摆放在棋盘上,使得任意两个棋子不同行,不同列,求有多少种不同 ...

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

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

  4. POJ1321 棋盘问题 —— DFS回溯

    题目链接:http://poj.org/problem?id=1321 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  5. poj1321棋盘问题(dfs+摆放问题)

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

  6. POJ1321棋盘问题(DFS)

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

  7. POJ1321 棋盘问题(dfs)

    题目链接. 分析: 用 dfs 一行一行的搜索,col记录当前列是否已经放置. AC代码如下: #include <iostream> #include <cstdio> #i ...

  8. poj1321 棋盘(dfs)

    #include<iostream> #include<cstring> using namespace std; ]={},sum=; ][]; void dfs(int a ...

  9. POJ1321棋盘问题

    http://poj.org/problem?id=1321 题意 : 我能说这是迄今为止见到的POJ上第二道中文题吗,既然是中文也很好理解,就不详述了 思路 : 典型的深搜DFS ; #includ ...

随机推荐

  1. 课时57.HTML被废弃的标签(掌握)

    1.为什么HTML中有一部分标签会被废弃? 因为当前HTML中的标签只有一个作用,就是用来添加语义,而早期的HTML标签中有一部分标签是没有语义的 有一部分标签是用来修改样式的 所以这部分标签就被淘汰 ...

  2. Java集合框架之Set接口

     1.Set接口不记录元素添加顺序的误区 public  void setDemo(){        Set<String> set1 = new HashSet<>();  ...

  3. 简析--UUID

    内容转载自:http://www.cnblogs.com/java-class/p/4727698.html 阅读目录 1.UUID简介 2.UUID组成 3.UUID实战演练 1.UUID 简介 U ...

  4. JDBCUtils工具类(转)

    JdbcUtils.java import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource ...

  5. 基于SpringBoot+SpringSecurity+mybatis+layui实现的一款权限系统

    这是一款适合初学者学习权限以及springBoot开发,mybatis综合操作的后台权限管理系统 其中设计到的数据查询有一对一,一对多,多对多,联合分步查询,充分利用mybatis的强大实现各种操作, ...

  6. bootstrap Table动态绑定数据并自定义字段显示值

    第一步:我们在官网下载了bootstrap 的文档,并在项目中引入bootstrap table相关js文件,当然,也要记得引入jquery文件 大概如图: 第二步:定义一个table控件 第三步:j ...

  7. you don't have permission to access forbidden

    前几天装一个phpStudy 集成环境,打开测试页面的时候突然出现如下错误: 有一些小总结. 一些小的开发测试在本地开发的话,直接localhost/file  就可以,  如果涉及到大的开发环境,一 ...

  8. scala成长之路(4)compaion object——伴生对象的使用

    虽然java一直声称自己是完全面向对象的语言,但一直以来都被很多人所质疑,其中java的静态成员函数就是主要的“罪魁祸首”.由于java中保留了静态方法的调用,导致其编程模式依然有过程式编程的可能,尤 ...

  9. 08 datetime与logging模块(进阶)

    datetime与logging模块 阶段一:日期与时间 1.datetime 模块中 主要类: 类名 功能说明 date 日期对象,常用的属性有year, month, day time 时间对象h ...

  10. 修复网站漏洞对phpmyadmin防止被入侵提权的解决办法

    phpmyadmin是很多网站用来管理数据库的一个系统,尤其是mysql数据库管理的较多一些,最近phpmysql爆出漏洞,尤其是弱口令,sql注入漏洞,都会导致mysql的数据账号密码被泄露,那么如 ...