AcWing 1114. 棋盘问题
原题链接
简单
作者:
Value
,
2020-03-01 13:30:09
,
所有人可见
,
阅读 748
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10;
char mp[N][N];
bool place[N][N];
int res;
int n, k;
bool check(int x, int y){
bool ans = true;
for(int i = 0; i < n; i ++ ){
if(place[x][i] && i != y){
ans = false;
break;
}
}
for(int i = 0; i < n; i ++ ){
if(place[i][y] && i != x){
ans = false;
break;
}
}
return ans;
}
void dfs(int t, int start){
if(t == k){
res ++ ;
return ;
}
for(int i = start; i < n; i ++ ){
for(int j = 0; j < n; j ++ ){
if(mp[i][j] == '#' && check(i ,j)){
place[i][j] = true;
dfs(t + 1, i + 1);
place[i][j] = false;
}
}
}
}
int main(){
while(cin >> n >> k && n != -1 && k != -1){
res = 0;
memset(place, false, sizeof(place));
for(int i = 0; i < n; i ++ ){
cin >> mp[i];
}
dfs(0, 0);
cout << res << endl;
}
return 0;
}
start是什么意思
一行只能放置一个棋子,在dfs里面寻找到第i行可以放置棋子的位置,只需要从下一行,也就是i+1行开始搜索;而不是又从第0行开始,你可以看看n皇后问题!
谢谢,我明白了