zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    memcached 服务器安装
    农行接口开发
    mysql备份
    IIS下的FTP使用
    建行接口
    Android网络编程之一个Android下菜单系统模块的实现(客户端—更新菜单)
    Android网络编程之一个Android下菜单系统模块的实现(客户端—更新桌号)
    Android网络编程之下菜单系统中的真机调试问题小结
    Android网络编程之一个Android下菜单系统模块的实现(服务器端—更新桌号)
    Android之一个简单的Activity启动画面
  • 原文地址:https://www.cnblogs.com/LOW-ctfer/p/10307425.html
Copyright © 2011-2022 走看看