• hdu 2102


    虽然多了一层,但是还是比较基础的搜索题目,在T时间内,其实只要求出最小时间就可以了,然后比较两者,既然是求最小的时间,那么用广搜就比较好了……

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;

    struct node
    {
     int f;
     int x,y;
    }n1;

    char map[2][12][12];
    int vis[2][12][12];
    int n,p,t,time;
    int dx[4]={-1,0,1,0};
    int dy[4]={0,1,0,-1};
    int fp,xp,yp;
    queue<node> q;

    void bfs()
    {
     node m,k;
     while(!q.empty())
     {
      m=q.front();
      //cout<<m.f<<" "<<m.x<<" "<<m.y<<endl;
      q.pop();
      if(m.f==fp&&m.x==xp&&m.y==yp)
      {
       time=vis[fp][xp][yp]-1;//因为起点被赋值为1了
       return;
      }

      for(int i=0;i<4;i++)
      {
       k=m;
       k.x+=dx[i];
       k.y+=dy[i];

       if((k.x)>=0&&(k.x)<n&&(k.y)>=0&&(k.y)<p&&map[k.f][k.x][k.y]!='*'&&vis[k.f][k.x][k.y]==0)
       {
        vis[k.f][k.x][k.y]=vis[m.f][m.x][m.y]+1;
        //cout<<vis[k.f][k.x][k.y]<<" "<<m.f<<" "<<m.x<<" "<<m.y<<endl;
        if(map[k.f][k.x][k.y]=='#'&&map[!k.f][k.x][k.y]!='*'&&map[!k.f][k.x][k.y]!='#')//这里我认为是要加这个的,不然会一直在两个时空穿梭机里面来来去去……
        {
                        vis[!k.f][k.x][k.y]=vis[k.f][k.x][k.y];//这里一定要注意,经过时空穿梭机到另一面后也要记录其步数,起初,没有考虑这个,WA,最后用输出查出来发现了这里……
         k.f=!k.f;
         q.push(k);
        }
        else if(map[k.f][k.x][k.y]=='.'||map[k.f][k.x][k.y]=='P')
        {
         q.push(k);
        }
       }
      }
     }
    }

    int main()
    {
     int T;

     cin>>T;
     while(T--)
     {
      cin>>n>>p>>t;
      int i,j;
      for(i=0;i<n;i++)
      {
       for(j=0;j<p;j++)
       {
        cin>>map[0][i][j];//这里我感觉用cin输入比较好一点,毕竟cin是忽略空格和空行的
        if(map[0][i][j]=='P')
        {
         fp=0;
         xp=i;
         yp=j;
        }
       }
      }

      for(i=0;i<n;i++)
      {
       for(j=0;j<p;j++)
       {
        cin>>map[1][i][j];
        if(map[1][i][j]=='P')
        {
         fp=1;
         xp=i;
         yp=j;
        }
       }
      }

      memset(vis,0,sizeof(vis));
      while(!q.empty())//q必须得被清空
       q.pop();

      n1.f=0;
      n1.x=0;
      n1.y=0;
      time=10000000;
      vis[0][0][0]=1;//记得赋值
      q.push(n1);
      bfs();

      //cout<<time<<endl;
      if(time>t)
       cout<<"NO"<<endl;
      else
       cout<<"YES"<<endl;
     }

     return 0;
    }

         

  • 相关阅读:
    AtCoder Regular Contest 061
    Codeforces Round #370 (Div. 2)
    2016 ACM/ICPC Asia Regional Dalian Online
    HDU 5513 Efficient Tree
    Codeforces Round #104 (Div. 1)
    2016 Hunan Province Programming Contest
    2016 Multi-University Training Contest 7
    2016中国大学生程序设计竞赛
    聚会「AHOI 2008」
    游戏「AHOI / HNOI2018」
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2361785.html
Copyright © 2020-2023  润新知