简单的 dfs 搜索
超时代码
dfs 中套入了两层循环
#include<iostream>
#include<cstring>
using namespace std;
char mp[9][9];
int vis[9];
int ans = 0;
int n;
void dfs(int s, int k){
if(k == 0){ans++; return ; }
for(int i = s; i < n; i++){// 两层循环超时
for(int j = 0; j < n; j++){
if(mp[i][j] == '.' || vis[j] == 1) continue;
vis[j] = 1;
dfs(s+1, k-1);
vis[j] = 0;
}
}
}
int main(){
int k;
while(scanf("%d%d", &n, &k) == 2){
if((n == -1) && (k == -1)) break;
for(int i = 0; i < n; i++){
scanf("%s", &mp[i]);
}
ans = 0;
memset(vis, 0, sizeof(vis));
dfs(0, k);
cout << ans << endl;
}
return 0;
}
AC代码
#include<iostream>
#include<cstring>
using namespace std;
int n, k, cnt = 0, ans = 0;
char mp[9][9];
int vis[10];
void dfs(int row){
if(cnt == k) {ans++; return ;}
if(row >= n) return ;
for(int i = 0; i < n; i++){
if(mp[row][i] == '#' && vis[i] == 0){
vis[i] = 1;
cnt ++;
dfs(row + 1);
cnt --;
vis[i] = 0;
}
}
dfs(row + 1); // 一行查完每找到,去下一行找
}
int main(){
while(scanf("%d%d", &n, &k) == 2){
if(n == -1 && k == -1) break;
for(int i = 0; i < n; i++){
cin >> mp[i];
}
cnt = 0;
ans = 0;
memset(vis, 0, sizeof(int));
dfs(0);
cout << ans << endl;
}
return 0;
}