博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dfs - 走过的标记取消
阅读量:7153 次
发布时间:2019-06-29

本文共 1318 字,大约阅读时间需要 4 分钟。

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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
21 题意 : 只能在 # 的位置下东西,问最终由多少种放置方法 ?
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int eps = 1e6+5;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;#define Max(a,b) a>b?a:b#define Min(a,b) a>b?b:a#define ll long longint n, k;char mp[10][10];int ans = 0;int c[10];void dfs(int r, int cnt){ if (cnt == k){ ans++; return; } if (r > n || cnt > k) return; for(int i = 1; i <= n; i++){ if (mp[r][i] == '#' && !c[i]) { c[i] = 1; dfs(r+1, cnt+1); c[i] = 0; } } dfs(r+1, cnt);}int main() { while (~scanf("%d%d", &n, &k)){ if (n == -1 && k == -1) break; for(int i = 1; i <= n; i++){ scanf("%s", mp[i]+1); } ans = 0; dfs(1, 0); printf("%d\n", ans); } return 0;}

 

转载于:https://www.cnblogs.com/ccut-ry/p/7738463.html

你可能感兴趣的文章
bzoj1046(HAOI2007)上升序列
查看>>
bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
查看>>
js获取本机内网IP地址和MAC地址
查看>>
7. Reverse Integer
查看>>
MySql错误处理(三)- 错误处理的例子
查看>>
Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解
查看>>
Linux多线程Pthread学习小结
查看>>
JVM性能调优入门
查看>>
关于BMP
查看>>
UML视频
查看>>
Jmeter性能测试 入门
查看>>
jmeter实现Http接口测试介绍
查看>>
iOS 九宫格的实现
查看>>
总结各种width,height,top,left
查看>>
Python基础8_文件处理
查看>>
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效
查看>>
结对项目开发(石家庄地铁乘车系统)
查看>>
CentOS6.2安装PhpMyadmin3.3.10
查看>>
Java运行环境的搭建---Windows系统
查看>>
定时任务redis锁+自定义lambda优化提取冗余代码
查看>>