可以使用DFS遍历即可:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10;
char matrix[N][N];
bool visited[N][N];
int num;
bool isValid(int row, int col){
for(int i = 0; i < row; i++)
if(visited[i][col]) return false;
for(int j = 0; j < col; j++)
if(visited[row][j]) return false;
return true;
}
void dfs(int n, int k, int row, int number){
if(row == n){
if(number == k) num++;
}
else{
for(int j = 0; j < n; j++){ //在row这一行选一个位置放棋子
if(matrix[row][j] == '#' && isValid(row, j)){
visited[row][j] = true;
dfs(n, k, row + 1, number + 1);
visited[row][j] = false;
}
}
dfs(n, k, row + 1, number); //row这一行不放棋子
}
}
int main(){
int n, k;
while(scanf("%d%d", &n, &k) != EOF && n != -1){
getchar();
num = 0;
memset(visited, false, sizeof(visited));
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
scanf("%c", &matrix[i][j]);
}
getchar();
}
dfs(n, k, 0, 0);
printf("%d\n", num);
}
return 0;
}