poj 1321 棋盘问题(dfs)

题目链接: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, 
truesizeof(b)) ;
        cout 
<< dfs(0, k) << endl ;
    }
    
return 0 ;
}
原文地址:https://www.cnblogs.com/xiaolongchase/p/2162544.html