思路
看到答案小于等于100,考虑爆搜。这题要考虑的东西比较多。
有如下要点:
- 萨尔和恐惧魔王移动的时候如果下一步不能走,那就原地不动。
- 当重新进入萨尔的范围内时,剩余可用时间重计。
- 你可以选择原地不动。
- 这题每个点不是只能走一次的,因为你可以站着不动,等待恐惧魔王走到你这里来。
考虑到这里,我们的爆搜代码就能写出来了。
代码
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
#define lhs printf("\n");
using namespace std;
const int N=1e5+10;
const int M=2024;
const int inf=0x3f3f3f3f;
int n,m,s,d;
char a[114][114],se[114],kj[114];
int dx[]={0,0,1,-1,0};
int dy[]={1,-1,0,0,0};
int dx2[]={0,-1,1,0,0};
int dy2[]={0,0,0,-1,1};
int sx,sy,ex,ey;
int ans=inf;
int vis[114][114];
void dfs(int x,int y,int sur,int t,int sex,int sey,int kjx,int kjy) //当前位置 离开庇护还剩余的时间 所用时间 萨尔位置 恐惧位置
{
if(t>=ans or t>100)return;
if(x==kjx and y==kjy)
{
ans=min(ans,t);
return;
}
for(int i=0;i<=4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1 and nx<=n and ny>=1 and ny<=m and a[nx][ny]=='0')
{
int k=sqrt((x-sex)*(x-sex)+(y-sey)*(y-sey));//距离
if(k<=d)
{
//萨尔和恐惧魔王变动
int nsex=dx2[int(se[t%strlen(se)])-48]+sex;
int nsey=dy2[int(se[t%strlen(se)])-48]+sey;
int nkjx=dx2[int(kj[t%strlen(kj)])-48]+kjx;
int nkjy=dy2[int(kj[t%strlen(kj)])-48]+kjy;
if(nsex<1 or nsex>n)
{
nsex=sex;
}
if(nsey<1 or nsey>m)
{
nsey=sey;
}
if(nkjx<1 or nkjx>n)
{
nkjx=kjx;
}
if(nkjy<1 or nkjy>m)
{
nkjy=kjy;
}
if(a[nsex][nsey]=='1')
{
nsex=sex;
nsey=sey;
}
if(a[nkjx][nkjy]=='1')
{
nkjx=kjx;
nkjy=kjy;
}
//时间需要重置
dfs(nx,ny,s,t+1,nsex,nsey,nkjx,nkjy);
}
else if(k>d and sur>0)
{
int nsex=dx2[int(se[t%strlen(se)])-48]+sex;
int nsey=dy2[int(se[t%strlen(se)])-48]+sey;
int nkjx=dx2[int(kj[t%strlen(kj)])-48]+kjx;
int nkjy=dy2[int(kj[t%strlen(kj)])-48]+kjy;
if(nsex<1 or nsex>n)
{
nsex=sex;
}
if(nsey<1 or nsey>m)
{
nsey=sey;
}
if(nkjx<1 or nkjx>n)
{
nkjx=kjx;
}
if(nkjy<1 or nkjy>m)
{
nkjy=kjy;
}
if(a[nsex][nsey]=='1')
{
nsex=sex;
nsey=sey;
}
if(a[nkjx][nkjy]=='1')
{
nkjx=kjx;
nkjy=kjy;
}
dfs(nx,ny,sur-1,t+1,nsex,nsey,nkjx,nkjy);
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=1;i<=n;i++)
{
char x[114];
scanf("%s",x);
for(int j=1;j<=m;j++)
{
a[i][j]=x[j-1];
}
}
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
scanf("%s%s",se,kj);
dfs(sx,sy,s,0,sx,sy,ex,ey);
printf("%d",ans);
return 0;
}