zoukankan      html  css  js  c++  java
  • hdu 2102 a计划问题。。 双层dfs问题

    Problem Description
    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
    现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
     
    Input
    输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
     
    Output
    如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
     
    Sample Input
    1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
     
    Sample Output
    YES
    对于搜索的思想 我想没有太多的问题(对于传送门的问题  如果下一层对应的位置还是们或者墙 就算了吧)  主要是优化的问题
    一开始我想用两个dfs来搜索 时间消耗太大了 而且重复的东西很多 于是我把两个dfs合并再一起 然后再进行搜索 
    合并以后 还是出现了超时的问题   递归是很消耗时间的  那么 对于传送门的判断就不应该在实行递归以后再判断  应该在递归之前就进行相应的判断
    贴上代码
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    char mapp[2][11][11];
    int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int vis[2][11][11];
    int flag;
    int t,n,m;
    void dfs(int x,int y,int cont,int revel)
    {
     int xx,yy,i;
     if(flag==1) return;
     if(mapp[revel][x][y]=='P')
     {
      if(cont<=t) flag=1;
      return;
     }
     if(cont>=t) return;
     for(i=0;i<4;i++)
     {
      xx=x+dir[i][0];
      yy=y+dir[i][1];
      if(vis[revel][xx][yy]==1||xx<=0||xx>n||yy<=0||yy>m||mapp[revel][xx][yy]=='*') continue;
      if(mapp[revel][xx][yy]=='#')
      {
       if(mapp[1-revel][xx][yy]=='#'||mapp[1-revel][xx][yy]=='*') continue;
       else
       {
        vis[revel][xx][yy]=1;
              dfs(xx,yy,cont+1,1-revel);
              vis[revel][xx][yy]=0; 
       }
      }
      else
      {
        vis[revel][xx][yy]=1;
          dfs(xx,yy,cont+1,revel);
          vis[revel][xx][yy]=0;
      }
      
     }
    }
    int main()
    {
     int c,i,j,k;
     cin>>c;
     while(c--)
     {
      cin>>n>>m>>t;
    //  memset(mapp,0,sizeof(mapp));
      for(k=0;k<=1;k++)
      {
          for(i=1;i<=n;i++)
             {
             for(j=1;j<=m;j++)
             {
             cin>>mapp[k][i][j];
          }
          }
         }
      flag=0;
      memset(vis,0,sizeof(vis));
      vis[0][1][1]=1;
      dfs(1,1,0,0);
      if(flag==1) cout<<"YES"<<endl;
      else cout<<"NO"<<endl;
     }
     return 0;
    }
     
     
  • 相关阅读:
    ASP.NET 表单验证 Part.1(理解表单验证)
    Silverlight 简介 Part.3(设计 Siverlight 页面)
    ASP.NET 成员资格 Part.3(LoginStatus、LoginView、PasswordRecovery)
    ASP.NET 网站部署 Part.1(安装IIS、复制文件部署网站)
    ASP.NET Dynamic Data Part.1(创建动态数据应用程序)
    ASP.NET 安全模型 Part.2(SSL)
    ASP.NET MVC Part.2(扩展基本的 MVC 应用程序)
    ASP.NET 网站部署 Part.2(使用 Web 部署)
    开发高级 Web 部件
    创建 Web 部件(WebPart 类、简单的 Web 部件)
  • 原文地址:https://www.cnblogs.com/z1141000271/p/5402419.html
Copyright © 2011-2022 走看看