棋盘问题

Time Limit: 1000MS  Memory Limit: 10000K

Total Submissions: 70224  Accepted: 33254

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

Source

蔡错@pku
------------------------------------------------------------------------------------------------------------------------------------------------------
本题为一道典型的深搜的模板题
但刚开始见到的时候往往会找不到地方下手
博主的思路就是按照行进行深搜
然后标记给列
这样就能保证不重复地遍历所有元素
当然只有map上面是#的才能放咯
下面上我注释仔细
谁都看的懂的代码
------------------------------------------------------------------------------------------------------------------------------------------------------
 //Author:LanceYu
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<fstream>
#include<iosfwd>
#include<sstream>
#include<fstream>
#include<cwchar>
#include<iomanip>
#include<ostream>
#include<vector>
#include<cstdlib>
#include<queue>
#include<set>
#include<ctime>
#include<algorithm>
#include<complex>
#include<cmath>
#include<valarray>
#include<bitset>
#include<iterator>
#define ll long long
using namespace std;
const double clf=1e-;
//const double e=2.718281828;
const double PI=3.141592653589793;
const int MMAX=;
//priority_queue<int>p;
//priority_queue<int,vector<int>,greater<int> >pq;
char map[][];
int vis[];
int n,m,sum,num;
void dfs(int x)//按照行数搜索
{
if(m==num)//如果做到了放入n个棋子,方案总数+1
{
sum++;
return;
}
if(x>n-)//不能越界
return;
for(int j=;j<n;j++)
{
if(!vis[j] && map[x][j]=='#')//如果这一层能放,就直接放进去,计数器+1
{
vis[j]=;//纵轴标记,不能再次访问
num++;
dfs(x+);
num--;
vis[j]=;
}
}
dfs(x+); //如果这一行没有,就直接进入下一行,继续搜索
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==-&&m==-)
return ;
sum=;num=;
for(int i=;i<n;i++)
scanf("%s",map[i]);
memset(vis,,sizeof(vis));
dfs();
printf("%d\n",sum);
} return ;
}

------------------------------------------------------------------------------------------------------------------------------------------------------

(不懂DFS的请点击链接)

Notes:主要是了解DFS算法的本质

略微修改下模板即可AC

2018-11-20  01:46:50  Author:LanceYu

最新文章

  1. 【BZOJ-1369】Gem 树形DP
  2. Android 图片闪烁(延迟切换)
  3. JAVA一些常用的时间操作
  4. hdu 4734 数位dp
  5. iOS开发工具——网络封包分析工具Charles
  6. String StringBuilder以及StringBuffer
  7. android 图片全屏
  8. MVC 控制器详解
  9. 十度好友问题(DFS经典应用)
  10. DLL运行时动态加加载的问题
  11. Iterator、Iterable接口的使用及详解
  12. picturefill + picture 标签 实现兼容性很棒的 响应式图片 自适应 屏幕大小
  13. CSDN没有审核投诉的真实性直接删除博主上传的资源
  14. 使用Mediaplay类写一个播放器
  15. 关闭Linux中的iptables,firewalld,SELINUX
  16. Linux系统时间的设置
  17. JNDI数据源的配置
  18. javascript Uncaught ReferenceError: 方法名 is not defined
  19. Chap7:民间用语[《区块链中文词典》维京&amp;甲子]
  20. R—读取数据(导入csv,txt,excel文件)

热门文章

  1. 03-flex-wrap是否换行
  2. [C4W4] Convolutional Neural Networks - Special applications: Face recognition &amp; Neural style transfer
  3. 【声明式事务】Spring事务特性(二)
  4. 近似计算一个对象在js占用内存
  5. SVG开发注意事项
  6. nginx的6种负载均衡策略
  7. Neo4j 第十一篇:Cypher函数
  8. Spring源码系列 — 注解原理
  9. 读书会荐书 - 关于Ada Lovelacer的书
  10. IDA分析时添加新的C语言结构体