OpenJudge/Poj 1321 棋盘问题
1.链接地址:
http://bailian.openjudge.cn/practice/1321
http://poj.org/problem?id=1321
2.题目:
棋盘问题
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20403 Accepted: 10138 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 -1Sample Output
2
1Source
3.思路:
dfs+简单剪枝即可
思路和八皇后问题非常类似
比八皇后简单是不需要去除斜线的位置
比八皇后稍微复杂是棋盘不固定大小
4.代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib> using namespace std; int **arr;
int n;
int res; void dfs(int m,int k)
{
int i,j; if(k == ) { res++; return; } if(m < n)
{
if(n - m < k) return;//剪枝一,剩余的行数少于需要摆放的棋盘,则不符合要求 dfs(m + ,k); for(i = ; i < n; ++i)
{
if(arr[m][i] == )
{
for(j = m + ; j < n; ++j) if(arr[j][i] != -) ++arr[j][i];
dfs(m + ,k - );
for(j = m + ; j < n; ++j) if(arr[j][i] != -) --arr[j][i]; }
}
}
} int main()
{
//freopen("C://input.txt","r",stdin); int i,j; int k; // n <= 8 , k <= n
cin >> n >> k; while(n != - || k != -)
{
arr = new int*[n];
for(i = ; i < n; ++i) {arr[i] = new int[n];memset(arr[i],,sizeof(int) * n);} char ch;
for(i = ;i < n; ++i)
{
for(j = ;j < n; ++j)
{
cin >> ch;
if(ch == '.') arr[i][j] = -;
}
} /*for(i = 0;i < n; ++i)
{
for(j = 0;j < n; ++j)
{
cout << arr[i][j] << " ";
}
cout << endl;
}*/ res = ; dfs(,k); cout << res << endl; for(i = ; i < n; ++i) delete [] arr[i];
delete [] arr; cin >> n >> k;
} return ;
}
OpenJudge/Poj 1321 棋盘问题的更多相关文章
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- DFS POJ 1321 棋盘问题
题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...
- POJ 1321 棋盘问题(C)回溯
Emmm,我又来 POJ 了,这题感觉比上次做的简单点.类似皇后问题.但是稍微做了一点变形,比如棋子数量是不定的.棋盘形状不在是方形等等. 题目链接:POJ 1321 棋盘问题 解题思路 基本思路:从 ...
- OpenJudge/Poj 1191 棋盘分割
1.链接地址: http://bailian.openjudge.cn/practice/1191/ http://poj.org/problem?id=1191 2.题目: 总时间限制: 1000m ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- POJ 1321 - 棋盘问题 - [经典DFS]
题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...
- poj 1321 棋盘问题 递归运算
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19935 Accepted: 9933 Description ...
- poj 1321 棋盘问题 简单DFS
题目链接:http://poj.org/problem?id=1321 很久没有敲搜索了啊,今天敲了个水题练练手,哈哈.... 题目大意: 就是求在n*n的方格上放置k个棋子的方案数 代码: #inc ...
- POJ 1321 棋盘问题(状态压缩DP)
不总结的话, 同一个地方会 WA 到死 思路: 状态压缩 DP. 1. s 表示压缩状态, 若第 i 列放了棋子, 那么该列置 1, 否则该列置 0. 假如 s = 3(0x011) 那么表示棋盘的第 ...
随机推荐
- 【转】/etc/grub.conf文件详解
转自:http://leejia.blog.51cto.com/4356849/788902 grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动 ...
- [Practical Git] Format commit history with git log arguments
When running the git log command, we can pass in options as arguments toformat the data shown for ea ...
- 转ABAP将内表行列转换实例(动态内表) .
把内表的行列转换,网上的例子很多,但是新人想看懂,几乎很难,所以总结下我是怎么完成的. 比如:你的内表如图: 你想让内表最后展示成这样:如图: 那么完成之后会是这样: 完成这个过程,得用到动态内表.看 ...
- Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
- careercup-C和C++ 13.9
13.9 编写支持对齐分配的malloc和free函数,分配内存时,malloc函数返回的地址必须都能被2的n次方整除. 解法: 一般来说,使用malloc,我们控制不了分配的内存会在堆里哪个位置.我 ...
- 判断ie,并确定其版本号
var UA = navigator.userAgent,isIE = UA.indexOf('MSIE') > -1,v = isIE ? /\d+/.exec(UA.split(';')[1 ...
- IIS 之 启用日志记录
如何为网站启用日志记录或 在 Microsoft Internet Information Services (IIS) 6.0 中,在 IIS 5.0 中,并在 IIS 4.0 中的FTP 站点.可 ...
- 实例化的两种方法(new和函数法)
// 定义类 类名字是 classA function classA(){ this.b=1; } classA.prototype.b=44; classA.prototype.s ...
- BeanFactory与FactoryBean
1. BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring IOC 所遵守的最底层和最基本的编程规范.在 ...
- MySQL之select查询、function函数
一.select查询 //查询某张表所有数据 select * from temp; //查询指定列和条件的数据 //查询name和age这两列,age等于22的数据 ; //as对列重命名 //as ...