深度优先搜索(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)的Java实现