DFS例题

DFS例题:

给定整数a1,a2,……,an,判断是否可以从中选出若干数,使他们的和恰好为k。

限制条件:

1<=n<=20

-108<=ai | k<=108

 1 #include<cstdio>
 2 using namespace std;
 3 int k,n;
 4 //已经从前i项得到了部分和temp,然后对i之后的项进行分支 
 5 bool DFS(int a[],int temp,int i){
 6     if(i==n) return temp==k;//前n项都计算过了,返回temp是否与k相等 
 7     if(DFS(a,temp,i+1)) return true;//不加上a[i]的情况 
 8     if(DFS(a,temp+a[i],i+1)) return true;//加上a[i]的情况 
 9     return false;//无论是否加上a[i]都凑不成k就返回false 
10 }
11 int main(){
12     scanf("%d%d",&n,&k);
13     int b[n];
14     for(int i=0;i<n;i++){
15         scanf("%d",&b[i]);
16     }
17     if(DFS(b,0,0))printf("Yes");
18     else printf("No");
19     return 0;

 【POJ2386】Lake Counting
   有一个大小为M*N的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里共有多少水洼?(八连通指的是下面图中相对W的*的部分)
   ***
   *W*
   ***
   限制条件:
   N,M≤100


   输入
   
   第一行包含两个正整数 N 和 M,表示将一个园子地面分成N*M块方格,N 行,M列,接下来的 N 行描述了园子地面状况,其中‘W’表示积水的水洼,‘.’表示没有积水。1 <= N <= 100; 1 <= M <= 100
   
   输出
   
   仅一个数,表示水洼的总数。
  
   输入示例
   
   10 12
   w........ww.
   .www.....www
   ....ww...ww.
   .........ww.
   .........w..
   ..w......w..
   .w.w.....ww.
   w.w.w.....w.
   .w.w......w.
   ..w.......w.
   
  输出示例
  3

思路:

DFS:

从矩阵中w开始,将该w和与它八连通的w都换成 . ,每次做这样的处理就count一次。

 1 include<cstdio>
 2 #include<iostream>
 3 #define MAX 110
 4 using namespace std;
 5 int n,m;
 6 char b[MAX][MAX];
 7 void DFS(int x,int y){
 8     b[x][y]='.';
 9     for(int dx=-1;dx<=1;dx++){
10         for(int dy=-1;dy<=1;dy++){
11             int nx=x+dx,ny=y+dy;
12             if(0<=nx&&0<=ny&&nx<n&&ny<m&&b[nx][ny]=='w') {
13                 DFS(nx,ny);
14             }
15         }
16     }
17     return ;
18 }
19 int main(){
20     scanf("%d%d",&n,&m);
21     for(int i=0;i<n;i++){
22         for(int j=0;j<m;j++){
23             //scanf("%c",&b[i][j]);
24             cin>>b[i][j];
25         }
26     }
27     int count=0;
28     for(int i=0;i<n;i++){
29         for(int j=0;j<m;j++){
30             if(b[i][j]=='w') {
31                 DFS(i,j);count++;
32             }
33         }
34     }
35     //printf("%c",b[0][0]);
36     printf("%d",count);
37     //cout<<b[0][0];
38     return 0;
39 } 

总结:输入时,用scanf会快,但是它读入回车,因此不能有回车的输入,因此按照题目的输入方式就会不正确。最后用的标准输入cin。

原文地址:https://www.cnblogs.com/LOW-ctfer/p/10307425.html