DFS问题,类似 :845. 八数码
#include <iostream>
using namespace std;
const int N = 10;
int n, k;
char g[N][N];
bool col[N]; //表示哪些列被占用了
int dfs(int u, int s)
{
if (s == k) return 1; //已经放够了棋子
if (u == n) return 0; //棋盘已经放满
int res = dfs(u + 1, s); //该行不放棋子的情况
for (int i = 0; i < n; i ++ )
if (g[u][i] == '#' && !col[i])
{
col[i] = true;
res += dfs(u + 1, s + 1);
col[i] = false; //恢复现场
}
return res;
}
int main()
{
while (cin >> n >> k, ~n || ~k)
{
for (int i = 0; i < n; i ++ ) cin >> g[i];
cout << dfs(0, 0) << endl; //从第0行开始,当前有0个棋子
}
return 0;
}