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

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

题目大意:

给你一个不规则的棋盘(棋盘见样例),和定量棋子,问有多少种摆放方式,使得棋盘上每行每列都最多只有一枚棋子。

回溯法的经典题。

类似八皇后。

就是逐行搜索,确定每一行棋子放在哪,找到一个解后返回上一步。

第一次写是参考别人的代码的,用了isok函数,思路比较清晰吧,后来自己优化了一下。

#include <cstdio>

using namespace std;

int n,k;
char board[][]; int total;
int c[]; bool isok(int row)
{
if(board[row][c[row]]=='.')
return false;
for(int i=;i<row;i++)
{
if(c[i]==-)
continue;
if(c[i]==c[row])
return false;
}
return true;
} void queen(int row,int num)
{
if(num==k)
{
total++;
return;
}
if(row==n)
return;
for(int i=;i<n;i++)
{
c[row]=i;
if(isok(row))
queen(row+,num+);
}
c[row]=-;
queen(row+,num);
} int main()
{
while(scanf("%d%d",&n,&k),n!=-)
{
for(int i=;i<n;i++)
scanf("%s",board[i]); total=;
queen(,);
printf("%d\n",total);
}
return ;
}
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<iostream>
#define ll long long
#define maxn 10000 char board[][];
int n,k;
int cnt;
int vis[]; void queen(int row,int num)
{
if(num==)
{
cnt++;
return;
}
if(row+num->n)
return;
for(int i=;i<=n;i++)
{
if(board[row][i]=='#'&&!vis[i])
{
vis[i]=;
queen(row+,num-);
vis[i]=;
}
}
queen(row+,num);
} int main()
{
while(scanf("%d%d",&n,&k),n!=-)
{
for(int i=;i<=n;i++)
scanf("%s",board[i]+); cnt=;
memset(vis,,sizeof(vis));
queen(,k); printf("%d\n",cnt);
}
return ;
}

poj 1321 棋盘问题 (回溯法)的更多相关文章

  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 棋盘问题(搜索)

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

  5. poj 1321 棋盘问题

    八皇后问题变形,回溯法. #include <cstdio> #include <cstring> #include <iostream> using namesp ...

  6. Poj 1321 棋盘问题 【回溯、类N皇后】

    id=1321" target="_blank">棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

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

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

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

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

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

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

随机推荐

  1. python3快速入门教程错误和异常

    Python 中(至少)有两种错误:语法错误(syntax errors)和异常(exceptions). 语法错误 语法错误又称作解析错误: >>> while True prin ...

  2. 02_Pandas基本使用

    1.Pandas读取数据 一般错误 import pandas as pd pd.read_csv(r'D:\数据分析\02_Pandas\pandas\food_info.csv') out: -- ...

  3. 修改Linux克隆的物理地址 和 IP地址

    实在不行就重新启动一下   才会改成 ech0 完成后文件配置环境变量 作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具.

  4. PV、UV、IP、TPS、QPS、RPS等网络度量术语

    PV:(访问量)即Page View --页面浏览量或单击量.用户每一次对网站中的任何页面进行访问后,被记录为一次PV,用户对同一页面的多次刷新,访问量将进行累计: UV:(独立访客)即Unique ...

  5. input 输入框 只能输入数字、字母、汉字等

    1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...

  6. ruby2.2 DevKit 安装后无法使用解决方案

    windows 系统下,Ruby 的某些 gem 包需要 DevKit 才能正常安装,2.4 以后的版本可以一键安装 DevKit,之前的版本只能手动安装. 2.4 以后的可以到官网下载:https: ...

  7. 走近深度学习,认识MoXing:初识华为云ModelArts的王牌利器 — MoXing

    [摘要] 本文为MoXing系列文章第一篇,主要介绍什么是MoXing,MoXing API的优势以及MoXing程序的基本结构. MoXing的概念 MoXing是华为云深度学习服务提供的网络模型开 ...

  8. 【nodejs原理&源码赏析(1)】Express中间件系统的基本实现

    一直觉得express的中间件系统这种流式处理非常形象,就好像加工流水线一样,每个环节都在针对同一个产品的不同部分完成自己的工作,最后得到一个成品.今天就来实现一个简易的[中间件队列]. 一. API ...

  9. .Net Core的API网关Ocelot使用 (一)

    1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...

  10. ios开发之block的使用,及注意事项

    转自:http://my.oschina.net/u/1432769/blog/390401 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于 ...