POJ-1321 棋盘问题(DFS+回溯)
2016-07-13 11:44
183 查看
POJ-1321 棋盘问题(DFS+回溯)
Time Limit: 1000MS | Memory Limit: 10000K | |
---|---|---|
Total Submissions: 34746 | Accepted: 17137 |
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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
题意:求在n*n的图中放m个的种类,简单DFS解决,注意条件任意的两个棋子不能放在棋盘中的同一行或者同一列,’#’是棋盘可以摆,’.’是空的不可以摆。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; #define eps 1e-6 #define pi 3.14159265359 typedef long long LL; const int maxn = 10; int n, m, ma,cnt; char a[maxn][maxn]; int vis[maxn]; /*在n*n的图中放m个的种类*/ void dfs(int r,int curM){ if(curM == m){ cnt++; return; } if(r>n) return; for(int j=1;j<=n;j++){ if( a[r][j] == '#' && vis[j]==0 ){ //vis[j] 标记第j列用过 【下层搜的时候直接判断】 vis[j] = 1; dfs(r+1,curM+1); vis[j] = 0; } } dfs(r+1,curM); return; } int main(){ while(~scanf("%d %d",&n,&m) && (n!=-1 || m!=-1)){ memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ getchar(); for(int j=1;j<=n;j++){ scanf("%c",&a[i][j]); } } cnt = 0; dfs(1,0); cout<<cnt<<endl; } return 0; } /* 4 4 #### #### #### #### 24 */
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- C#避免回溯方法心得
- C语言使用回溯法解旅行售货员问题与图的m着色问题
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- 回溯算法 图m着色问题
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- 小心别落入正则回溯陷阱
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ1523 SPF dfs
- poj1731 Orders dfs
- Surrounded Regions
- Binary Tree Zigzag Level Order Traversal,Restore IP Addresses,Word Search,Simplify Path