题目链接: [棋盘问题]
大致题意:
给出n*n的棋盘,放k个棋子,要求棋子不能同行同列,并且#代表可以放,问可以放k个棋子的方案数
解题思路:
dfs深搜,定义vis数组记录列的情况。
AC代码:
#include<iostream>
typedef long long ll;
using namespace std;
char mp[10][10];
int vis[10];//列
int n, k, ans;
void dfs(int m,int cnt) {
if (cnt == k) { ans++; return; }
for (int i = m; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (vis[j] == 1 || mp[i][j] == '.')continue;//这一列不可走
vis[j] = 1;
dfs(i + 1, cnt + 1);
vis[j] = 0;
}
}
}
int main(void)
{
while (cin >> n >> k) {
if (n == -1 && k == -1)break;
for (int i = 0; i < n; ++i)cin >> mp[i];
ans = 0;
dfs(0, 0);
cout << ans << endl;
}
return 0;
}