POJ1321(KB1-A 简单搜索)
棋盘问题
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个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
每组数据的第一行是两个正整数,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
2 1
Source
1 //2017-02-19 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 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<<cnt<<endl; 41 } 42 43 return 0; 44 }
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 stub 29 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 }