题目链接:点击查看
题意:按照题意进行即可
题解:注意标记,vis[i][j] i表示对坐标的哈希,j表示当前计算的x,值为之前得到多少汽油了,因为如果再次经过这个位置,两次经过的中间得到多汽油,并且改变了图中的2,所以要继续走,知道,走到一个位置,汽油数不增加,然后就是注意一些剪枝
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a,b;
ll k;
char mp[2010][2010];
int vis[2100][255];
char step[255];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
scanf("%d%d%lld",&a,&b,&k);
scanf("%s",step+1);
int sum=0;
for(int i=0;i<=n*m;i++)
for(int j=0;j<=250;j++)
vis[i][j]=-1;
for(int i=1;i<=n;i++)
{
scanf("%s",mp[i]+1);
for(int j=1;j<=m;j++)
{
if(mp[i][j]=='2')
sum++;
}
}
int ans=0;
int x;
int xx,yy;
int st=0;
while(1)
{
x=81*(mp[a][b]-'0')+27*(mp[a-1][b]-'0')+9*(mp[a+1][b]-'0')+3*(mp[a][b-1]-'0')+(mp[a][b+1]-'0');
if(vis[(a-1)*m+b][x]==ans) break;
vis[(a-1)*m+b][x]=ans;
x++;
// cout<<a<<" "<<b<<" "<<x<<" "<<step[x]<<" "<<endl;
if(step[x]=='U') xx=a-1,yy=b;
if(step[x]=='D') xx=a+1,yy=b;
if(step[x]=='L') xx=a,yy=b-1;
if(step[x]=='R') xx=a,yy=b+1;
if(step[x]=='P')
{
if(mp[a][b]=='2')
{
ans++;
mp[a][b]='0';
}
if(ans>=sum) break;
xx=a,yy=b;
}
if(step[x]=='I')
{
xx=a,yy=b;
break;
}
if(mp[xx][yy]=='1') break;
st++;
if(st==k) break;
a=xx;
b=yy;
}
printf("%d\n",ans);
}
return 0;
}