棋盘问题 - POJ 1321 - Virtual Judge (vjudge.net)
典型的DFS,唯一要注意的就是只有“#”才能放棋子
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 20;
int c[N];
int ans;
int n, k, m;
vector<string>a(N);
void dfs(int cur) {
if (m == k) {
ans++;
return;
}
if (cur >= n)
return;
for (int i = 0; i < n; i++) {
if (!c[i]&&a[cur][i]=='#') {
c[i] = 1;
m++;
dfs(cur + 1);
c[i] = 0;
m--;
}
}
}
void solve(){
while (cin >> n >> k) {
if (n == -1 && k == -1) {
return;
}
ans = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
dfs(0);
cout << ans << '\n';
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
std::cout.tie(0);
int t = 1;
//cin >> t;
while (t--)
solve();
return 0;
}