题目链接:http://poj.org/problem?id=1321
按行搜索,当前棋格所在列无棋子且当前位置可放棋子时搜索下一位置(k-1)。若当前行无法放置,搜索下一行(k)。
代码:
#include<iostream>
#include<cstring>
using namespace std ;
char a[8][8] ;
bool b[8] ; //记录第i列是否放了棋子
int count, n ;
int dfs(int r, int k){
if(k==0){ //所有棋子放完则产生一个新方案
count ++ ;
return count ;
}
if(r>=n) return count ; //搜索完毕
for(int j=0; j<n; j++){
if(b[j]&&a[r][j]=='#'){
b[j] = false ;
dfs(r+1, k-1) ;
b[j] = true ; //回溯
}
}
dfs(r+1, k) ;
}
int main(){
int k, i, j ;
while(true){
cin >> n >> k ;
if(n==-1&&k==-1) break ;
count = 0 ;
for(i=0; i<n; i++){
for(j=0; j<n; j++){
cin >> a[i][j] ;
}
}
memset(b, true, sizeof(b)) ;
cout << dfs(0, k) << endl ;
}
return 0 ;
}
#include<cstring>
using namespace std ;
char a[8][8] ;
bool b[8] ; //记录第i列是否放了棋子
int count, n ;
int dfs(int r, int k){
if(k==0){ //所有棋子放完则产生一个新方案
count ++ ;
return count ;
}
if(r>=n) return count ; //搜索完毕
for(int j=0; j<n; j++){
if(b[j]&&a[r][j]=='#'){
b[j] = false ;
dfs(r+1, k-1) ;
b[j] = true ; //回溯
}
}
dfs(r+1, k) ;
}
int main(){
int k, i, j ;
while(true){
cin >> n >> k ;
if(n==-1&&k==-1) break ;
count = 0 ;
for(i=0; i<n; i++){
for(j=0; j<n; j++){
cin >> a[i][j] ;
}
}
memset(b, true, sizeof(b)) ;
cout << dfs(0, k) << endl ;
}
return 0 ;
}