Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 27749   Accepted: 13710

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
题意清晰,回溯也非常明白。建议学习回溯的时候对N皇后还有N皇后的变式好好学习一下,类N皇后真是学习回溯非常好的例题。
分析:
如在第i行第j列,遇到'#'号。那么接下来的处理就有两种情况了。
第一种:把i,j放入到一个数组C中,然后继续向第i+1行进行搜索,直到找到K个位置或者到了棋盘的边界
另外一种:我不选择第i行第j列的位置,然后继续向第i+1行进行搜索,直到找到K个位置或者到了棋盘的边界
最后。回溯另一个很重要的就是剪枝,剪枝过程在代码里面有凝视。
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 15;
int N,K,ans,C[maxn];
char Map[maxn][maxn];
bool can_place(int row,int col)
{
for(int i = 0;i < row;i++)
{
if(C[i] == col) return false;
}
return true;
}
void DFS(int row,int cur) {
if(cur == K)
{
ans ++;
return;
}
if(row >= N) return;
if(cur + (N-row) < K) return; // 剪枝
for(int j = 0;j < N;j++)
{
if(Map[row][j] == '#'&&can_place(row,j))
{
C[row] = j;
DFS(row+1,cur+1);
C[row] = -1;
}
}
DFS(row+1,cur);
}
int main() {
freopen("input.in","r",stdin);
while(~scanf("%d %d",&N,&K))
{
if(N == -1 && K == -1) break;
for(int i = 0;i < N;i++) scanf("%s",Map[i]);
ans = 0;
memset(C,-1,sizeof(C));
for(int j = 0;j < N;j++)
{
if(Map[0][j] == '#')
{
C[0] = j;
DFS(1,1);
C[0] = -1;
}
}
DFS(1,0);
printf("%d\n",ans);
}
return 0;
}

Poj 1321 棋盘问题 【回溯、类N皇后】的更多相关文章

  1. POJ 1321 棋盘问题(C)回溯

    Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...

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

    POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...

  3. DFS POJ 1321 棋盘问题

    题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...

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

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

  5. (简单) POJ 1321 棋盘问题,回溯。

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

  6. poj 1321 棋盘问题 (回溯法)

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

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

    题目链接:http://poj.org/problem?id=1321 题意:中文题目,就不多说了...... 思路: 解题方法挺多,刚开始想的是先从N行中选择出来含有“#”的K行,再在这K行中放置K ...

  8. POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)

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

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

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

随机推荐

  1. pull的时候报错

  2. linux下sh语法(转载)

    介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序. 在这个例子中我们使用/bin/sh来执行程序. 当编写 ...

  3. codevs1358棋盘游戏(状压dp)

    1358 棋盘游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master     题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初 ...

  4. go 条件语句if

    一.if 语句 格式 if condition { // do something } 举例 package main import "fmt" func main(){ var ...

  5. office 2010 破解

    使用Rearm命令激活延迟重置Office 20101.安装Offcie 2010 安装Offcie 2010,默认30天的试用期,这里要注意,上文提供的Office 2010是零售版,所以没有序列号 ...

  6. struts2标签(五)

    标签体系结构 jsp出现目的是为了取代servlet,结果逻辑代码,数据库代码都放到了jsp页面中. 为了解决jsp中代码过多的问题,struts2标签分为普通标签和UI标签. 使用struts2标签 ...

  7. SQLServer2008 关于CASE WHEN

    CASE WHEN的两种格式 1.简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END 2.Case搜索函数 CASE ...

  8. List 练习

    (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double sa ...

  9. CentOS 7 中配置通过 daemon 模式启动的 Tomcat 8 服务

    距离上次折腾已经有很长一段时间了... 不说这个,刚好有空闲,把这两天折腾的 Tomcat 8 的服务配置整理出来收录一下. 1.JDK安装 1)检查服务器是否预装了 openJdk,如果有就删除,在 ...

  10. 乐乎共享wifi充电宝项目