棋盘问题
2016-05-06 09:22
295 查看
A - 棋盘问题
Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
Submit Status Practice POJ
1321
Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
Sample Output
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<string, int>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
using namespace std;
char mmap[10][10];
bool vis[10];
int n,k;
int dfs(int row,int coun){
//cout<<row<<' '<<coun<<"**********"<<endl;
int sum=0;
if(coun == k) return 1;
if(row < n){
for(int i=0;i<n;i++){
if(vis[i]==false&&mmap[row][i] == '#'){
vis[i] = true;
sum+=dfs(row+1,coun+1);
vis[i] = false;
}
}
sum+=dfs(row+1,coun);
}
return sum;
}
int main (){
while(~rd2(n,k)&&n!=-1&&k!=-1){
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%s",mmap[i]);
}
printf("%d\n",dfs(0,0));
}
return 0;
}
Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
Submit Status Practice POJ
1321
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
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<string, int>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
using namespace std;
char mmap[10][10];
bool vis[10];
int n,k;
int dfs(int row,int coun){
//cout<<row<<' '<<coun<<"**********"<<endl;
int sum=0;
if(coun == k) return 1;
if(row < n){
for(int i=0;i<n;i++){
if(vis[i]==false&&mmap[row][i] == '#'){
vis[i] = true;
sum+=dfs(row+1,coun+1);
vis[i] = false;
}
}
sum+=dfs(row+1,coun);
}
return sum;
}
int main (){
while(~rd2(n,k)&&n!=-1&&k!=-1){
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%s",mmap[i]);
}
printf("%d\n",dfs(0,0));
}
return 0;
}
相关文章推荐
- 链表排序——插入排序(纯C语言版)
- web开发者谷歌浏览器常用插件
- sort排序方法二
- GlobalSign 多域型(SNAs) SSL 证书
- 背景及文字渐变色闪烁动画
- SessionFactory创建失败
- Xenko 平台安装和配置
- Objective-C的缓存框架EGOCache在iOS App开发中的使用
- struts 拦截器设置防止表单的重复提交
- 身份证号验证 银行卡号验证
- Jenkins常用插件之Cppcheck Plugin
- 实现底部栏(tab)功能的几种方式
- maven加载本地oracle的JDBC驱动
- Android 屏幕适配方案
- 在ASP.NET 2.0中操作数据之十:使用 GridView和DetailView实现的主/从报表
- SharePoint 2013 图文介绍匿名访问,及问题解决方法。
- 解决Android studio导入项目gradle location is incorrect问题
- 数据结构之简单链表(尾部插入数据)
- 删除单向链表中的某一个节点
- 每天laravel-20160801| Container -4