博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1321(KB1-A 简单搜索)
阅读量:5342 次
发布时间:2019-06-15

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

棋盘问题

Time Limit: 1000MS  Memory Limit: 10000K

Total Submissions: 40872  Accepted: 19936

Description

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

Source

 
1 //2017-02-19 2 #include 
3 #include
4 #include
5 6 using namespace std; 7 8 int n, k, cnt; 9 char M[10][10];10 bool col[10];11 12 void dfs(int row, int step)//row表示当前行数,step表示已经放的棋子数13 {14 if(step == k){15 cnt++;16 return;17 }18 if(row >= n)return;19 dfs(row+1, step);//该行不放棋子20 for(int j = 0; j < n; j++)21 if(col[j] == false && M[row][j]=='#'){22 col[j] = true;23 dfs(row+1, step+1);//该行放棋子24 col[j] = false;25 }26 }27 28 int main()29 {30 while(cin>>n>>k)31 {32 if(n==-1 && k==-1)break;33 cnt = 0;34 memset(col, 0, sizeof(col));35 for(int i = 0; i < n; i++)36 for(int j = 0; j < n; j++)37 cin>>M[i][j];38 39 dfs(0, 0);40 cout<
<
1 import java.io.BufferedInputStream; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 // 2018-03-08 5 public class Main { 6     static final int N = 10; 7     static int ans, n, k; 8     static char[][] M = new char[N][N]; 9     static boolean[] col = new boolean[N];10     11     public static void dfs(int row, int cnt) {12         if(cnt == k) {13             ans++;14             return;15         }16         if(row == n)return;17         for(int i = 0; i < n; i++) {18             if(M[row][i] == '#' && !col[i]) {19                 col[i] = true;20                 dfs(row+1, cnt+1);21                 col[i] = false;22             }23         }24         dfs(row+1, cnt);25     }26     27     public static void main(String[] args) {28         // TODO Auto-generated method stub29         Scanner cin = new Scanner(new BufferedInputStream(System.in));30 31         while(cin.hasNext()) {32             n = cin.nextInt();33             k = cin.nextInt();34             cin.nextLine();35             if(n == -1 && k == -1)break;36             for(int i = 0; i < n; i++) {37                 M[i] = cin.nextLine().toCharArray();38             }39             Arrays.fill(col, false);40             ans = 0;41             dfs(0, 0);42             System.out.println(ans);43         }44     }45 46 }

 

 

转载于:https://www.cnblogs.com/Penn000/p/6419736.html

你可能感兴趣的文章
linux下编译安装nginx
查看>>
adb命令
查看>>
SQL自定义排序 ORDER BY
查看>>
Modal模态框scrolltop保留上次位移的解决方案
查看>>
python 函数(一)
查看>>
我说我在总结谁会信。。
查看>>
数据库索引的作用和长处缺点
查看>>
Laravel 安装代码智能提示扩展「laravel-ide-helper」
查看>>
java开发配套版本
查看>>
MySQL的 Grant命令权限分配
查看>>
非阻塞的c/s,epoll服务器模型
查看>>
YII框架安装过程总结
查看>>
HDOJ(HDU) 1862 EXCEL排序(类对象的快排)
查看>>
Codeforces Round #381 (Div. 2) 复习倍增//
查看>>
Money类型转化为String去除小数点后0解决方法
查看>>
ArcScene 高程不同的表面无法叠加
查看>>
[ONTAK2010] Peaks
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>