zoukankan      html  css  js  c++  java
  • 挑战程序设计竞赛里面的几道深度优先搜索

    1. poj2386 Lake Counting 简单题
      #include<iostream>
      #include<cstring>
      using namespace std;
      
      int n,m;
      char map[101][101];
      int dir[8][2] = { {1,0},{1,1},{1,-1},{0,1},{0,-1},{-1,0},{-1,-1},{-1,1} };
      bool vis[101][101];
      
      void dfs(int x,int y)
      {
          int nx,ny;
          vis[x][y]=1;
          for(int k=0;k<8;k++)
          {
              nx=x+dir[k][0];ny=y+dir[k][1];
              if( nx>=n || nx<0 || ny>=m || ny<0 || vis[nx][ny]  )
                  continue;
              if(map[nx][ny] == 'W')
                  dfs(nx,ny);
          }
      }
      
      int main(){
          cin>>n>>m;
          memset(vis,0,sizeof(vis));
          for(int i=0;i<n;i++)
              cin>>map[i];
          //getchar();
          
          int cnt=0;
          for(int i=0;i<n;i++){
              for(int j=0;j<m;j++){
                  if(vis[i][j])
                      continue;
                  if(map[i][j] == 'W'){
                      dfs(i,j);
                      cnt++;
                  }
              }
          }
          cout<<cnt<<endl;
          return 0;
      } 
      
      /*
      10 12
      W........WW.
      .WWW.....WWW
      ....WW...WW.
      .........WW.
      .........W..
      ..W......W..
      .W.W.....WW.
      W.W.W.....W.
      .W........W.
      ..W...W...W.
      */
      View Code
    2. poj1979 Red and Black 简单题
      /*
      ID: neverchanje
      PROG:
      LANG: C++11
      */
      #include<vector>
      #include<iostream>
      #include<cstring>
      #include<string>
      #include<algorithm>
      #include<cmath>
      #include<cstdio>
      #include<set>
      #include<queue>
      using namespace std;
      
      int w,h, mx,my,cnt;
      char map[21][21];
      int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
      bool vis[21][21];
      
      bool can_reach(int x,int y){
          return (x<h&&x>=0&&y<w&&y>=0&&map[x][y]!='#'&&!vis[x][y]);
      }
      
      int dfs(int x,int y){
          int nx,ny;
          cnt++;
          vis[x][y]=1;
          for(int i=0;i<4;i++)
          {
              nx=x+dir[i][0];ny=y+dir[i][1];
              if(can_reach(nx,ny))
              {
                  dfs(nx,ny);
              }
          }
      }
      
      int main(){
      //    freopen("a.txt","r",stdin);
      //    freopen(".out","w",stdout);
          while(cin>>w>>h){
              if(!(w|h))
                  break;
              getchar();
              for(int i=0;i<h;i++)
                  gets(map[i]);
              for(int i=0;i<h;i++)
                  for(int j=0;j<w;j++)
                      if(map[i][j]=='@')
                      {mx=i;my=j;}
              cnt=0;
              memset(vis,0,sizeof(vis));
              dfs(mx,my);
              cout<<cnt<<endl;    
          }
          return 0;
      }
      
      /*
      DESCRIPTION:
      
      */
      View Code
    3. poj3009 curling2.0(DFS模拟题)
      /*
      ID: neverchanje
      PROG:
      LANG: C++11
      */
      #include<vector>
      #include<iostream>
      #include<cstring>
      #include<string>
      #include<algorithm>
      #include<cmath>
      #include<cstdio>
      #include<set>
      #include<queue>
      using namespace std;
      
      int w,h;
      int map[21][21];
      int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
      int sx,sy,ML;
      bool vis[21][21];
      
      bool border(int x,int y){
          return (x>=h || x<0 || y<0 ||y>=w);
      }
      
      void dfs(int x,int y,int mve){
          if(mve>10||mve>ML)//如果已经超出预期,则不可到达 
              return;
          for(int i=0;i<4;i++){
              int nx=x+dir[i][0];int ny=y+dir[i][1];
              if( border(nx,ny) || map[nx][ny]==1 )
                  continue;//////////////
              while(1){
                  if(border(nx,ny))
                      break;
                  if(!map[nx][ny]){
                      nx+=dir[i][0];ny+=dir[i][1];
                      continue;
                  }
                  
                  if(map[nx][ny]==1)
                  {
                      map[nx][ny]=0;
                      dfs(nx-dir[i][0],ny-dir[i][1],mve+1);
                      map[nx][ny]=1;
                      break;
                  }
                       
                  if(map[nx][ny]==3)
                  {
                      ML=min(ML,mve+1);
                      return;
                  }
              }
          }
      }
      
      int main(){
      //    freopen("a.txt","r",stdin);
      //    freopen(".out","w",stdout);
          while(cin>>w>>h){
              if(!(w|h))    break;
              
              memset(map,0,sizeof(map));
              for(int i=0;i<h;i++)
                  for(int j=0;j<w;j++){
                      scanf("%d",&map[i][j]);
                      if(map[i][j]==2){
                          sx=i;sy=j;
                      }
                  }
                  
              ML=11;///
              map[sx][sy]=0;
              dfs(sx,sy,0);
              if(    ML<=10)
                  cout<<ML<<endl;
              else
                  cout<<-1<<endl;
          }
          return 0;
      }
      
      /*
      DESCRIPTION:
      快被这题整哭了。。。。以后不敢再随便设公有变量了FUCK!!! 
      */
      View Code
  • 相关阅读:
    Dynamic attention in tensorflow
    Dynamic seq2seq in tensorflow
    Tensorflow Seq2seq attention decode解析
    zz图像卷积与滤波的一些知识点
    Android SDK更新失败对策
    高维数据降维 国家自然科学基金项目 2009-2013 NSFC Dimensionality Reduction
    近期深度学习论文汇总
    PHP远程连接mysql报错处理办法
    zz 启动Matlab提示Microsoft Visual C++ 2005 Redistributable存在问题问题
    `fw服务端非完整` 工程开发初期的工作
  • 原文地址:https://www.cnblogs.com/neverchanje/p/3641471.html
Copyright © 2011-2022 走看看