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;
}

     

原文地址:https://www.cnblogs.com/Shirlies/p/2361785.html