题目:http://poj.org/problem?id=3009
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 10
using namespace std;
int n,k;
char map[MAXN][MAXN];
int cnt,ans;
bool isOK(int x, int y){
for(int i = 0; i < n; i++){
if(map[i][y]=='*')return false;
}
for(int i = 0; i < n; i++){
if(map[x][i]=='*')return false;
}
return true;
}
void dfs(int x, int y){
if(cnt==k){
ans++;
return;
}
if(y<n-1)y++;
else{
x++;
y = 0;
}
int i = x;
int j = y;
bool flag = false;
for(; i < n; i++){
for(; j < n; j++){
if(map[i][j]=='#'&&isOK(i,j)){
map[i][j] = '*';
cnt++;
dfs(i,j);
cnt--;
map[i][j] = '#';
dfs(i,j);
flag = true;
break;
}
}
if(flag)break;
j = 0;
}
}
int main(){
while(cin>>n>>k){
if(n==-1&&k==-1)break;
cnt = 0;
ans = 0;
for(int i = 0; i < n; i++)cin>>map[i];
dfs(0,-1);
cout<<ans<<endl;
}
}
总结: 深搜. 需要注意的是棋子都是一样的, 还有就是摆放棋子不能在同行同列. 所以可以看做是一个二叉树, 对每个不同行同列的#号, 有两种情况: 放棋子和不放棋子. 因为规模不大, 而且要求求出所有解的数量, 所以这样搜不会超时.