POJ - 1321 棋盘问题
来源:互联网 发布:淘宝十大男模特 编辑:程序博客网 时间:2024/05/18 00:59
题目介绍:
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
2 1#..#4 4...#..#..#..#...-1 -1Sample Output21
题目不难,尝试所有的情况,采用DFS较为简单,因为要不同行,不同列所以只需要加上列的访问标记即可,行在递归时就已经区别开了。
一定要注意访问完列后将标记重新设置为未访问状态
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; char A[8][8]; int row[8];//列标志 int n,k,count;//方法数 void DFS(int line,int num){ //棋子已放完 if(num == k){ count++; return; } for(int i=line ; i<n ; ++i){ for(int j=0 ; j<n ; j++){ //找到可以放的位置 if(!row[j] && A[i][j]=='#'){ //递归进行下一行遍历,棋子数同时减一 row[j]=1; DFS(i+1,num+1); row[j]=0; } } } } int main(void){ while(cin>>n>>k,n!=-1){ for(int i=0 ; i<n ; ++i){ cin>>A[i]; } //初始化列标志与方法数 count = 0; memset(row,0,n); //从0,0位置开始遍历 DFS(0,0); cout<<count<<endl; } return 0; }
0 0
- POJ 1321 棋盘问题
- poj 1321 棋盘问题
- poj 1321 棋盘问题
- Poj 1321 棋盘问题
- POJ 1321 棋盘问题
- POJ 1321 棋盘问题
- POJ-1321-棋盘问题
- poj 1321棋盘问题
- POJ 1321 棋盘问题
- poj 1321 棋盘问题
- POJ 1321 棋盘问题
- poj 1321 棋盘问题
- poj 1321 棋盘问题
- poj 1321 棋盘问题
- poj 1321 棋盘问题
- POJ 1321 - 棋盘问题
- poj 1321棋盘问题
- POJ 1321 棋盘问题
- FPGA 学习之路(六)任意分频技术
- (1.28)java.nio.ByteBuffer中flip、rewind、clear方法的区别
- Mysql连接数过大导致连接超时的问题
- C#不登录电脑启动程序
- stm32的寄存器的概念
- POJ - 1321 棋盘问题
- Java内存模型(十二)
- wikioi 1245最小N个和
- Xilinx zynq zc702学习总结
- 【九度oj】1019简单计算器
- HDU6011 Lotus and Characters
- C#不登录电脑启动程序_0
- DbUtils之更新(广义)和批处理操作
- spring boot 学习番外篇:超快速项目初始化