POJ 1321 棋盘问题(DFS)
来源:互联网 发布:淘宝评论完在哪里看 编辑:程序博客网 时间:2024/06/05 19:56
原题
棋盘问题
Time Limit: 1 Sec Memory Limit: 32 MB
Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。Input
输入含有多组测试数据。每组数据的第一行是两个正整数n和k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。(n<=8,k<=n)
当n和k均为-1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C(数据保证C<2^31)。Sample Input
2 1#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
21
涉及知识及算法
首先我们可以明确这是一个深度搜索的题目,与八皇后问题相似。我们建立一个函数DFS用来累计可行的方案数,我们走过一列我们就把它标记下来下次的时候就不可以再摆放在这一列(因为题目要求不可以将棋子摆放在同一行和同一列)
然后就从下一行开始寻找可行的地方,直到我们摆放的棋子数与我们被要求摆放的棋子数相同时,我们就将方案数进行一次++,然后在进行递归下去。
然后就从下一行开始寻找可行的地方,直到我们摆放的棋子数与我们被要求摆放的棋子数相同时,我们就将方案数进行一次++,然后在进行递归下去。
代码
#include <cstdio>#include <cstdlib>#include <iostream>#include <cstring>using namespace std; int n,k,ans;//棋盘char Map[12][12];int vis[12];int DFS(int i,int cur){ //如果可以摆完k个棋子,方案数加一并返回 if(cur>=k) { ans++; return 0; } //从当前行开始,并在其中循环遍历以实现所有 // 可能情况的组合· for(int x=i;x<n;x++) { for(int y=0;y<n;y++) { if(!vis[y]&&Map[x][y]=='#') { vis[y]=1; //在下一列摆放下一个 DFS(x+1,cur+1); //一个方案模拟后就还原 vis[y]=0; } } } return 0;}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&k)&&n!=-1) { ans=0; memset(Map,0,sizeof(Map)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%s",Map[i]); } DFS(0,0); printf("%d\n",ans); } return 0;} /************************************************************** Problem: 1310 Language: C++ Result: Accepted Time:0 ms Memory:1504 kb****************************************************************/文章转载自博客园博主心向晴,链接http://www.cnblogs.com/xinxiangqing/p/4692994.html,向他/她表示感谢
阅读全文
0 0
- POJ 1321 棋盘问题(棋盘DFS)
- POJ 1321 棋盘问题(DFS+回溯)
- poj 1321 棋盘问题 (DFS )
- POJ 1321 棋盘问题(DFS)
- poj 1321 棋盘问题(DFS)
- poj 1321 棋盘问题(dfs,回溯)
- poj 1321 棋盘问题(dfs)
- POJ 1321-棋盘问题(DFS)
- Poj 1321 棋盘问题 (DFS水题)
- POJ 题目1321 棋盘问题(DFS)
- POJ 1321 棋盘问题(dfs)
- POJ 1321 棋盘问题(dfs)
- POJ 1321 棋盘问题 (DFS)
- POJ 1321 棋盘问题 (DFS)
- 【POJ】1321 - 棋盘问题(dfs)
- POJ 1321 棋盘问题(dfs)
- POJ 1321 棋盘问题(DFS)
- POJ:1321 棋盘问题(深搜DFS)
- Educational Codeforces Round 26 ABC题
- 笔试题 找到数组中,三个数乘积最大的结果
- 大话数据结构 code 第三章 02线性表链式存储_LinkList
- Java循环结构-for语句、while语句详解
- (小工具)Java分组排序通用程序实践(终结篇)
- POJ 1321 棋盘问题(DFS)
- viewWillLayoutSubviews viewDidLayoutSubviews viewWillAppear
- unity3d认识
- C/C++学习笔记六(文件系统、预处理器)
- 面向对象三大基本特征——继承
- 关于连接查询和子查询等复杂查询的一些问题的整理
- 各种各样的IPC方式
- Python列表(list)和字典(dict)的操作方法
- Android与Html5交互第一篇章