百练1321:棋盘问题
来源:互联网 发布:悍将传世源码 编辑:程序博客网 时间:2024/06/05 10:04
1321:棋盘问题
- 查看
- 提交
- 统计
- 提示
- 提问
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
- 输入
- 输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 - 输出
- 对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
- 样例输入
2 1#..#4 4...#..#..#..#...-1 -1
- 样例输出
2
1
有点激动,这是我第一次独立写了一道递归&DFS的题。。。再接再厉。。
***************************************
开始时还没学DFS,所以用的递归超时了,超时的代码就不贴了。。
通过这道题我发现递归好像也没那么困难,首先写好退出的条件,这个比较容易。然后就进入核心的部分。很多时候涉及到回溯,那么可能有一个状态量先因为满足了某个条件被赋值(比如被置成true),然后在这个基础上调用递归函数,当这个递归函数返回时,就说明这个“基础”状态下的所有子树都被遍历到了,那么之前赋值的状态量就要被还原(置为false),其中可能涉及到某个标志位,注意一下就可以了。
其实递归有个时候也是在模拟这个问题的流程,比如这道题,递归函数做的事就是“在第row行放置第m个棋子”,row从1开始变,m也从1开始变,row或者m超了的话就返回。本质上也是在缩小问题的规模。
#include <cstdio>using namespace std;int num=0,n,k;bool lie[10]={ false };char chess[10][10];void place(int row,int m);int main(){ while(scanf("%d%d",&n,&k)!=EOF){ if(n==-1&&k==-1) return 0; getchar(); int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ scanf("%c",&chess[i][j]); } getchar(); } place(1,1); printf("%d\n",num); num=0; for(i=0;i<10;i++){ lie[i]=false; } } return 0;}void place(int row,int m) //试图在第row行放置第m个棋子{ int i; int flag=0; if(m>k){ num++; return; } if(row>n) { return; } //越界 for(i=1;i<=n;i++){ // 对列进行遍历 if(chess[row][i]=='#'&&!lie[i]){ if(!flag) flag=1; lie[i]=true; place(row+1,m+1); lie[i]=false; flag=0; } } if(!flag){ place(row+1,m); }}
***********************坚持,胜利就在眼前了~
阅读全文
0 0
- 百练 1321: 棋盘问题
- 百练1321:棋盘问题
- 百练1321:棋盘问题题解
- 百练之棋盘问题
- POJ 1321 棋盘问题【从头练dfs】
- 百练+棋盘问题+dfs和回溯,模板化解题
- DFS专练2 棋盘问题
- OpenJudge百炼 1321 棋盘问题
- POJ 1321 棋盘问题
- poj 1321 棋盘问题
- pku 1321 棋盘问题
- pku 1321 棋盘问题
- poj 1321 棋盘问题
- Poj 1321 棋盘问题
- POJ 1321 棋盘问题
- OPENJUDGE 1321 棋盘问题
- POJ 1321 棋盘问题
- POJ-1321-棋盘问题
- leetcode 306. Additive Number
- 大型网站架构之分布式消息队列
- 包 package
- [Lintcode] 105. Copy List with Random Pointer
- 数据结构与算法常见笔试题
- 百练1321:棋盘问题
- Eclipse Oxygen创建第一个Hibernate 5程序
- 双向链表
- Android零基础入门第61节:滚动视图ScrollView
- Tensorflow Model Persistence
- JS回调函数中无法改变外部变量的问题
- 关于C++构造与析构函数
- 【LeetCode】27. Remove Element
- JAVA工具类(12)---文本字符串工具类(数据替换,加密解密操作)