深度优先搜索(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 }

猜你喜欢

转载自www.cnblogs.com/FrankYu-/p/9637098.html