windows系統安裝docker
阿新 • • 發佈:2021-07-07
題目描述
PIPI有一個n*n的棋盤,以及k個棋子,它想把這些棋子擺放到棋盤中去。 同一行同一列只能擺放一顆棋子。
但是棋盤中有些格子是不能擺放棋子的,它想問你一共有多少不同種的擺放方式?
兩種擺放方式至少有一顆棋子擺放位置不同時視為不同擺放方式。
‘#’表示可以擺放棋子
‘.’表示不能擺放棋子
輸入
多組測試資料
每組資料的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。
輸出
對於每一組資料,給出一行輸出,輸出擺放的方案數目C (資料保證C<2^31)。
include<stdio.h>
include<stdlib.h>
include<string.h>
include<stdbool.h>
bool col_visited[10]; int ways; int n, k; char ch[10][10]; void DFS(int row,int chess_num) { if (row == n || chess_num == 0) { if (chess_num == 0)ways++; return; } for (int i = 0; i < n; i++) { if (!col_visited[i] && ch[row][i] == '#') { col_visited[i] = true; DFS(row + 1, chess_num - 1); col_visited[i] = false; } } DFS(row + 1, chess_num); } int main() { while ((scanf("%d %d", &n, &k)) != EOF) { for (int i = 0; i < n; i++) { scanf("%s", ch[i]); } ways = 0; for (int i = 0; i < 10; i++)col_visited[i] = false; DFS(0, k); printf("%d\n", ways); } }