题目链接:棋盘问题
解析:dfs暴力从上到下、从左到右搜索。
AC代码:
//代码1
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, k, ans;
char maze[10][10];
bool vis[10][10];
void dfs(int x, int y, int step){
if(step == k){
ans ++;
return ;
}
for(int i=x; i<n; i++)
for(int j=(i == x ? y : 0); j<n; j++){
if(!vis[i][j] && maze[i][j] == '#'){
bool used[10][10];
memset(used, false, sizeof(used));
for(int p=0; p<n; p++) //保存标记
for(int q=0; q<n; q++)
used[p][q] = vis[p][q];
for(int p=0; p<n; p++){
vis[i][p] = true;
vis[p][j] = true;
}
dfs(i, j, step+1);
for(int p=0; p<n; p++) //标记还原
for(int q=0; q<n; q++)
vis[p][q] = used[p][q];
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d%d", &n, &k) == 2){
if(n == -1 && k == -1) break;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>maze[i][j];
ans = 0;
memset(vis, false, sizeof(vis));
dfs(0, 0, 0);
printf("%d\n", ans);
}
return 0;
}
//代码2
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, k, ans;
char maze[10][10];
bool vx[10], vy[10];
void dfs(int x, int y, int step){
if(step == k){
ans ++;
return ;
}
for(int i=x; i<n; i++)
for(int j=(i == x ? y : 0); j<n; j++){
if(!vx[i] && !vy[j] && maze[i][j] == '#'){
vx[i] = true; //标记
vy[j] = true;
dfs(i, j, step+1);
vx[i] = false; //标记还原
vy[j] = false;
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d%d", &n, &k) == 2){
if(n == -1 && k == -1) break;
for(int i=0; i<n; i++)
scanf("%s", maze[i]);
ans = 0;
memset(vx, false, sizeof(vx));
memset(vy, false, sizeof(vy));
dfs(0, 0, 0);
printf("%d\n", ans);
}
return 0;
}