16级暑假训练一--棋盘问题
来源:互联网 发布:高中生软件培训学校 编辑:程序博客网 时间:2024/06/08 15:04
Problem Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。 <br>每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n <br>当为-1 -1时表示输入结束。 <br>随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 <br>
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
2 1#..#4 4...#..#..#..#...-1 -1
Sample Output
21
代码:
#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<algorithm>#include<cmath>#include<iomanip>#include<queue>using namespace std;int n,k,c,num; //c是方案数,num代表当前放置第几个char a[9][9];bool ok[9]; //记录列的使用情况void dfs(int row) //放置第num个,在第row行{ if(num>=k) {c++; return;} if(row>=n) return; for(int j=0;j<n;j++) { if(a[row][j]=='#'&&ok[j]==false) { ok[j]=true; num++; dfs(row+1); ok[j]=false; num--; } } dfs(row+1); //当前第num行不放}int main(){ while(scanf("%d%d",&n,&k)!=EOF) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) scanf("%s",a[i]); num=c=0; memset(ok,false,sizeof(ok)); dfs(0); printf("%d\n",c); } return 0;}
阅读全文
0 0
- 16级暑假训练一--棋盘问题
- 暑假训练(一) 通过的题目
- 【NYIST】暑假训练赛 (一)-----Problem H
- 【NYIST】暑假训练赛 (一)----Problem F
- 【NYIST】暑假训练赛 (一)-----Problem B
- 暑假编程训练---E:年龄问题
- 暑假集训第三周第二阶段 搜索 F - 棋盘问题
- POJ 一 1321 棋盘问题
- POJ训练计划1321_棋盘问题(DFS)
- 16级训练赛一
- 暑假训练-训练8.5 KMP
- 简单搜索(一)之 棋盘问题
- 匡斌带你飞 专题一 棋盘问题
- 暑假训练.2
- 【暑假专题训练#数据结构】
- 2015暑假训练总结
- 暑假训练赛20160719
- 暑假训练赛20160720
- dubbox + springMVC
- HTML5 file API加canvas实现图片前端JS压缩并上传
- activity的启动模式与newIntent()
- maven hello world
- 使用命令将本地代码上传至Git
- 16级暑假训练一--棋盘问题
- 深入了解String,特别是==与hashCode()
- Hadoop
- linux IO 内核参数调优 之 原理和参数介绍
- thinkPHP5-性能调试
- js如何获取点击<li>标签里的值
- Android上加载大图片需要注意的问题
- 用Hadoop构建电影推荐系统
- R语言实现随机森林