POJ.1321 棋盘问题 (DFS)
来源:互联网 发布:剑灵邀请一直网络忙 编辑:程序博客网 时间:2024/06/05 21:08
POJ.1321 棋盘问题 (DFS)
题意分析
给出n*n的棋盘,棋盘中#表棋盘区域,即可以放置棋子。现在有k个棋子,放置在棋盘区域中,并且要求任意两个棋子不能放在棋盘的同一行或者同一列。求放置k个棋子的方案数有多少。
如果要求不能放在同一行,那么在摆放的时候可以按行摆放。现在一行中找到能摆放的#的位置,然后放在这个位置上,dfs递归进入下一行,在下一行再找到合适的位置,如果剩余的棋子个数为0的时候,方案数目加一。
注意在选择位置的时候还要检查纵向是否已经摆放过棋子,若放过棋子,则此位置不能继续摆放棋子。
代码总览
#include <cstdio>#include <cstring>#include <algorithm>#define nmax 10using namespace std;char mp[nmax][nmax];bool visit[nmax][nmax];int n,k,ans;bool check(int x ,int y){ if(mp[x][y] != '#' || visit[x][y] == true ) return false; else{ for(int i = 0;i<n;++i){ if(visit[i][y]) return false; } } return true;}void dfs(int line,int left){ if(left == 0){ ans++; return; } if( line>=n ) return; for(int i = 0;i<n;++i){ if(check(line,i)){ visit[line][i] = true; dfs(line+1,left-1); visit[line][i] =false; } } dfs(line+1,left);}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&k) != EOF){ memset(mp,0,sizeof(mp)); memset(visit,0,sizeof(visit)); ans = 0; if(n == -1 && k == -1) break; for(int i = 0;i<n;++i){ scanf("%s",mp[i]); } dfs(0,k); printf("%d\n",ans); } return 0;}
阅读全文
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)
- 汉诺塔
- C++中static、const、static const修饰变量作用详解
- 文章标题
- Logstash插件filter介绍及ELK相关预警配置
- 识别浏览器的方法
- POJ.1321 棋盘问题 (DFS)
- 第五章 神经网络
- 王小二切饼
- pageEncoding和charset 编码 以及<%@ page contentType="text/html; charset=utf-8"....>作用
- attention 机制入门
- 以开始、中间、最后为基准的递归快排实现
- BZOJ 2442 [Usaco2011 Open]修剪草坪 DP+单调队列优化
- UVA 10815 (字符串处理)
- mysql删除大表更快的drop table办法