解题思路:本题可分为两种深搜方式,一种是按行作为搜索树的层数,另一种是按格子作为搜索树的层数。剩下的都是dfs的基本格式
C++代码
方法一
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10;
char g[N][N];
int n, k, cnt, res;
bool col[N];
void dfs(int u)
{
if (cnt == k)
{
res ++ ;
return ;
}
if (u == n) return ;
for (int i = 0; i < n; i ++ )
{
if (g[u][i] == '#' && !col[i])
{
col[i] = true;
cnt ++ ;
dfs(u + 1);
col[i] = false;
cnt -- ;
}
}
dfs(u + 1);
}
signed main()
{
while (cin >> n >> k, n != -1 && k != -1)
{
cnt = res = 0;
for (int i = 0; i < n; i ++ ) cin >> g[i];
dfs(0);
cout << res << endl;
}
return 0;
}
方法二
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10;
char g[N][N];
int n, k, cnt;
bool col[N], row[N];
void dfs(int u, int m)
{
if (m == 0)
{
cnt ++ ;
return ;
}
if (u == n * n) return ;
int x = u / n, y = u % n;
if (g[x][y] == '#' && !row[x] && !col[y])
{
row[x] = true;
col[y] = true;
dfs(u + 1, m - 1);
row[x] = false;
col[y] = false;
}
dfs(u + 1, m);
}
signed main()
{
while (cin >> n >> k, n != -1 && k != -1)
{
cnt = 0;
for (int i = 0; i < n; i ++ ) cin >> g[i];
dfs(0, k);
cout << cnt << endl;
}
return 0;
}
创作不易,大家可以在AcWing注册账号,参与一下AC之星计划,我的邀请码是MYRGS。对题解有任何疑问可以在评论区下面评论