poj 【1321】
来源:互联网 发布:产品经理被程序员打 编辑:程序博客网 时间:2024/06/04 01:03
棋盘问题
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 32487 Accepted: 16117
Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
每组数据的第一行是两个正整数,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
21
Source
蔡错@pku
#include <cstdio>#include <cstring>using namespace std;int n,tot;char map[10][10];int vis[10]; //用来判断列是否重复void dfs(int i, int k) //按照行从小到大的顺序{ if(n - i < k) //剪枝 return; if(!k) { tot++; return; } for(int j = 0; j < n; j++) { if(map[i][j] == '#' && !vis[j]) { vis[j] = 1; dfs(i+1, k-1); vis[j] = 0; } } dfs(i+1, k);}int main(){ int k; while(scanf("%d%d", &n, &k) != EOF) { if(n == -1 && k == -1) break; tot = 0; memset(vis,0,sizeof(vis)); for(int i = 0; i < n; i++) scanf("%s", map[i]); dfs(0,k); printf("%d\n", tot); } return 0;}
0 0
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- poj-1321
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- poj 1321
- POJ 1321
- POJ 1321
- poj --1321
- poj 1321
- poj-1321
- poj 1321
- POJ 1321
- 堆排序
- PAT1045 Favorite Color Stripe
- SAS中library是 excel引擎,LIBNAME STATEMENT
- Oracle卸载步骤
- SQL注入式攻击
- poj 【1321】
- java学习---JVM中的垃圾收集算法和Heap分区简记
- CentOS下使用命令行测试网速
- C#—结构与枚举
- c++ RAII
- 文章标题
- 线程-002-基本的线程机制
- 让CListCtrl的垂直滚动条自动跳到指定的ITEM子项位置
- 绿盟2016春季校招web前端笔试