深度优先搜索(DFS)与广度优先搜索(BFS)

Posted frankyu-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索(DFS)与广度优先搜索(BFS)相关的知识,希望对你有一定的参考价值。

T1:棋盘问题 POJ1321 http://poj.org/problem?id=1321

分析:本题给出棋盘分布以及落子数目,让我们求出在棋子不同行不同列摆放的情况下,有几种落子方式。

本题我们利用DFS算法,编写一个递归函数。从第一行第一列的位置开始在列内扫描,如果找到合适位置就落子,然后把这一列标记,表示这一列不能够再次落子。

这样之后,将前面落子位置往右往下移一位,在这个新位置调用递归函数。当棋子全部用完,则方案数加1。

PS:要注意理解整个过程的深度优先搜索思路,这样子有利于理解代码。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn=10;
 5 char chessboard[maxn][maxn];
 6 bool visit[maxn];//用于标记列是否还能够放下棋子 
 7 int ans;//表示方案数
 8 int k;//表示棋子数目
 9 int n;//表示棋盘的大小 
10 int DFS(int row,int nums_of_chess){//row代表当前行,nums_of_chess代表已经使用的棋子数目 
11     if(nums_of_chess==k){
12         ans++;
13         return 0;
14     }
15     for(int i=row;i<n;i++)
16         for(int j=0;j<n;j++)
17             if(!visit[j]&&chessboard[i][j]==#){//如果这一列没有被标记,而且这个位置是棋盘位置 
18                 visit[j]=true;//将这一列标记 
19                 DFS(i+1,nums_of_chess+1);//递归调用函数 
20                 visit[j]=false;//此处函数已经返回,应该将列标记还原,这样子才能够不影响下一行的过程判定
21             }
22     return 0;
23 }
24 int main(){ 
25     while(cin>>n>>k){
26         if(n==-1&&k==-1) break;
27         memset(visit,false,sizeof(visit));
28         for(int i=0;i<n;i++)
29         for(int j=0;j<n;j++)
30             cin>>chessboard[i][j];
31         ans=0;
32         DFS(0,0);
33         cout<<ans<<endl;
34     }
35     return 0;
36 }

 

以上是关于深度优先搜索(DFS)与广度优先搜索(BFS)的主要内容,如果未能解决你的问题,请参考以下文章

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

深度优先dfs与广度bfs优先搜索总结+例题

Python算法-深度优先搜索&广度优先搜索(DFS&BFS)

深度优先搜索(DFS)与广度优先搜索(BFS)

深度优先搜索DFS和广度优先搜索BFS