poj 1321 棋盘问题(dfs)
2011-09-01 22:39
316 查看
题目链接: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 ;
}
按行搜索,当前棋格所在列无棋子且当前位置可放棋子时搜索下一位置(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 ;
}
相关文章推荐
- POJ 1321 || 棋盘问题 (dfs + 优化
- 1321 Poj 棋盘问题(类似N皇后--暴力DFS)
- poj 1321 棋盘问题 简单dfs
- POJ-1321 棋盘问题(DFS+回溯)
- poj1321 棋盘问题 dfs入门 TWT Tokyo Olympic 1combo-1
- poj1321——棋盘问题(DFS)
- POJ1321 棋盘问题(dfs)
- poj 1321 棋盘问题 DFS+回溯 回溯学习
- POJ 1321 棋盘问题(暴力dfs or DP)
- poj 1321 棋盘问题(dfs)
- poj 1321 — 棋盘问题(简单DFS)
- POJ-1321(DFS) 棋盘问题
- POJ 1321 棋盘问题(DFS)
- poj 1321棋盘问题(dfs)
- 【POJ】1321 - 棋盘问题(dfs)
- poj 1321 棋盘问题 dfs
- POJ 1321 棋盘问题 (DFS + 回溯)
- POJ 1321--棋盘问题【DFS】
- POJ 题目1321 棋盘问题(DFS)
- poj 1321 棋盘问题 (dfs)