棋盘问题
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 #include3 #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 }