请求将样例3添加入数据
查看原帖
请求将样例3添加入数据
230243
syf2008楼主2023/2/23 07:58

RT

#include <bits/stdc++.h>
const int N=355;
using namespace std;
int n,m,s1,s2,d,sx,sy,ex,ey;
int dx[]={0,0,-1,1,1,1,-1,-1},dy[]={1,-1,0,0,1,-1,1,-1};
string s;
int v[N][N],x,tt[N][N],minn=1e9,minc1=1e9,minc2=1e9;
int f[N][N][16][16];
struct ss{int x,y,sum,c1,c2;}q1;
queue<ss>q;
void bfs()
{
	int xx,yy;
//	memset(f,0x3f,sizeof(f));
	q.push((ss){sx,sy,0,0,0});
	f[sx][sy][0][0]=1;
	while(!q.empty())
	{
		q1=q.front();q.pop();
//		cout<<q1.x<<' '<<q1.y<<' '<<q1.sum<<' '<<q1.c1<<' '<<q1.c2<<'\n';
		if(q1.x==ex&&q1.y==ey)
		{
			if(q1.sum>minn)break;
			if(q1.sum==minn)
			{
				minn=q1.sum;
				if(q1.c1+q1.c2==minc1+minc2&&q1.c1<minc1)
				minc1=q1.c1,minc2=q1.c2;
				if(q1.c1+q1.c2<minc1+minc2)
				minc1=q1.c1,minc2=q1.c2;
			}
			if(q1.sum<minn)minn=q1.sum,minc1=q1.c1,minc2=q1.c2;
			continue;
		}
		for(int i=0;i<8;i++)
		{
			xx=q1.x+dx[i];yy=q1.y+dy[i];
			if(xx<1||yy<1||xx>n||yy>m||v[xx][yy])continue;
			if(f[xx][yy][q1.c1][q1.c2])continue;
			f[xx][yy][q1.c1][q1.c2]=1;
			q.push((ss){xx,yy,q1.sum+1,q1.c1,q1.c2});
		}
		if(q1.c1<s1)
		{
			for(int i=0;i<8;i++)
			{
				xx=q1.x+dx[i];yy=q1.y+dy[i];
				if(xx<1||yy<1||xx>n||yy>m||v[xx][yy]==114514)continue;
				if(f[xx][yy][q1.c1+1][q1.c2])continue;
				f[xx][yy][q1.c1+1][q1.c2]=1;
				q.push((ss){xx,yy,q1.sum+1,q1.c1+1,q1.c2});
			}
		}
		if(q1.c2<s2)
		{
			for(int i=0;i<4;i++)
			{
				xx=q1.x+dx[i]*d;yy=q1.y+dy[i]*d;
				if(xx<1||yy<1||xx>n||yy>m||v[xx][yy])continue;
				if(f[xx][yy][q1.c1][q1.c2+1])continue;
				f[xx][yy][q1.c1][q1.c2+1]=1;
				q.push((ss){xx,yy,q1.sum+1,q1.c1,q1.c2+1});
			}
		}
		if(q1.c1<s1&&q1.c2<s2)
		{
			for(int i=0;i<4;i++)
			{
				xx=q1.x+dx[i]*d;yy=q1.y+dy[i]*d;
				if(xx<1||yy<1||xx>n||yy>m||v[xx][yy]==114514)continue;
				if(f[xx][yy][q1.c1+1][q1.c2+1])continue;
				f[xx][yy][q1.c1+1][q1.c2+1]=1;
				q.push((ss){xx,yy,q1.sum+1,q1.c1+1,q1.c2+1});
			}
		}
	}
}
void look(int x,int y,int k)
{
	for(int i=0;i<=k;i++)
	{
		tt[max(x-i,1)][max(y-(k-i),1)]++;
		tt[max(x-i,1)][min(y+(k-i),m)+1]--;
		tt[min(x+i,n)][max(y-(k-i),1)]++;
		tt[min(x+i,n)][min(y+(k-i),m)+1]--;
	}
}
int main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>m>>s1>>s2>>d;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		cin>>s;
		if(s=="S"){sx=i;sy=j;}
	else if(s=="T"){ex=i;ey=j;}
	else if(s!=".")
		{
			x=0;
			for(int i=0;i<s.size();i++)
			x=(x<<1)+(x<<3)+(s[i]^48);
			look(i,j,x-1);
			v[i][j]=114514;
		}
	}
	for(int i=1;i<=n;i++)
	for(int j=1,sum=0;j<=m;j++)
	{sum+=tt[i][j];v[i][j]=(sum>0);}
//	for(int i=1;i<=n;i++)
//	{
//		for(int j=1;j<=m;j++)
//		cout<<v[i][j]<<' ';
//		cout<<'\n';
//	}
	bfs();
	if(minn==1e9)cout<<"-1\n";
else cout<<minn<<' '<<minc1<<' '<<minc2<<'\n';
}

这份代码无法通过样例3,却在该题拿到了100

提交记录

2023/2/23 07:58
加载中...