求助!!!
查看原帖
求助!!!
168334
封禁用户楼主2020/7/30 17:55

95分,一点TLE

#include<bits/stdc++.h>
using namespace std;
const int maxn=351+10;
const int maxm=351+10;
const int maxys=21+10;
const int maxcy=21+10;
const int INF=0x3f3f3f3f;
const int dx[8]={-1,1,0,0,-1,1,1,-1};
const int dy[8]={0,0,-1,1,-1,1,-1,1};
int n,m,zys,zsy,d;
int sx,sy,ex,ey;
char maze[maxn][maxm];
bool saw[maxn][maxm],vis[maxn][maxm][maxys][maxcy];
struct node
{
  int x,y,step;
  int ys,sy;
};
node ans=(node){0,0,INF,INF,INF};
queue <node> q;
void find(int num,int x,int y)
{
  for(int i=1;i<=n;i++)
   for(int j=1;j<=m;j++)
     if(abs(x-i)+abs(y-j)<num)  saw[i][j]=true;
}
node com(node a,node b)
{
  if(a.step!=b.step)  return a.step<b.step?a:b;
  if(a.ys+a.sy!=b.ys+b.sy)  return a.ys+a.sy<b.ys+b.sy?a:b;
  return a.ys<b.ys?a:b;
}
bool check(int nx,int ny)
{
  if(nx<1 || nx>n || ny<1 || ny>m)  return false;
  if(maze[nx][ny]=='R')  return false;
  return true;
}
void bfs()
{
  q.push((node){sx,sy,0,0,0});
  while(!q.empty())
  {
    node u=q.front();
    q.pop();
    if(u.step>ans.step)  continue;
    if(u.x==ex && u.y==ey)  {ans=com(ans,u);continue;}
    for(int i=0;i<8;i++)
    {
      int nx=u.x+dx[i];
      int ny=u.y+dy[i];
      if(!check(nx,ny))  continue;
	  if(saw[nx][ny])
	  {
	  	if(vis[nx][ny][u.ys+1][u.sy] || u.ys+1>zys)  continue;
   		vis[nx][ny][u.ys+1][u.sy]=true;
	    q.push((node){nx,ny,u.step+1,u.ys+1,u.sy});
	  }
	  else
	  {
	  	if(vis[nx][ny][u.ys][u.sy])  continue;
   		vis[nx][ny][u.ys][u.sy]=true;
	    q.push((node){nx,ny,u.step+1,u.ys,u.sy});
	  }
	}
	if(u.sy+1>zsy)  continue;
	for(int i=0;i<4;i++)
	{
	  int nx=u.x+dx[i]*d;
      int ny=u.y+dy[i]*d;
      if(!check(nx,ny))  continue;
	  if(saw[nx][ny])
	  {
	  	if(vis[nx][ny][u.ys+1][u.sy+1] || u.sy+1>zsy)  continue;
   		vis[nx][ny][u.ys+1][u.sy+1]=true;
	    q.push((node){nx,ny,u.step+1,u.ys+1,u.sy+1});
	  }
	  else
	  {
	  	if(vis[nx][ny][u.ys][u.sy+1])  continue;
   		vis[nx][ny][u.ys][u.sy+1]=true;
	    q.push((node){nx,ny,u.step+1,u.ys,u.sy+1});
	  }
	}
  }
}

int main()
{
	scanf("%d%d%d%d%d",&n,&m,&zys,&zsy,&d);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	 {
	   string s;
	   cin>>s;
	   if(s=="S")  {sx=i;sy=j;maze[i][j]='.';vis[i][j][0][0]=true;}
	   else
	     if(s=="T")  {ex=i;ey=j;maze[i][j]='.';}
	     else
		   if(s==".")  maze[i][j]='.';
		   else
		   {
		     int num=0;
		     int len=s.size();
		     for(int k=0;k<len;k++)
		       num=num*10+(s[k]-'0');
		     find(num,i,j);
		     maze[i][j]='R';
		   }
	 }
	bfs();
	if(ans.step==INF)  printf("-1");
	else  printf("%d %d %d",ans.step,ans.ys,ans.sy);
	return 0;
}

2020/7/30 17:55
加载中...