当前位置: 代码迷 >> 综合 >> rqnoj-342-最不听话的机器人-dp
  详细解决方案

rqnoj-342-最不听话的机器人-dp

热度:18   发布时间:2023-12-19 11:02:11.0

dp[i][j][k][[l]: 执行第i步,执行到点(j,k),方向为l时,用的最大步数。

状态转移根据step[i]转移。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 99999999
using namespace std;
int xx[4]={1,0,-1,0};
int yy[4]={0,-1,0,1};
int dp[2][111][111][4];
int step[1100];
int map[110][110];
int main()
{int n,m,x0,y0,i,j,k,l;char str[10001];while(~scanf("%d%d%d%d",&n,&m,&x0,&y0)){for(i=1;i<=n;i++){scanf("%s",str);for(j=1;j<=n;j++){if(str[j-1]=='*')map[i][j]=0;else map[i][j]=1;}}for(i=1;i<=m;i++){scanf("%s",str);if(   strcmp(str,"FORWARD")==0)step[i]=1;else if( strcmp(str,"BACK")==0)step[i]=2;else if( strcmp(str,"LEFT")==0)step[i]=3;else if(strcmp(str,"RIGHT")==0)step[i]=4;}for(i=0;i<2;i++){for(j=0;j<=n+10;j++){for(k=0;k<=n+10;k++){for(l=0;l<4;l++)dp[i][j][k][l]=-INF;}}}dp[0][x0][y0][0]=0;int maxn;maxn=0;for(i=1;i<=m;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++){if(map[j][k]==0)continue;for(l=0;l<4;l++){if(step[i]==1){dp[i%2][j][k][l]=max(dp[(i+1)%2][j+xx[l]][k+yy[l]][l]+1,dp[(i+1)%2][j][k][l]);}else if(step[i]==2){dp[i%2][j][k][l]=max(dp[(i+1)%2][j-xx[l]][k-yy[l]][l]+1,dp[(i+1)%2][j][k][l]);}else if(step[i]==3){dp[i%2][j][k][l]=max(dp[(i+1)%2][j][k][(l+4-1)%4]    +1,dp[(i+1)%2][j][k][l]);}else if(step[i]==4){dp[i%2][j][k][l]=max(dp[(i+1)%2][j][k][(l+1)%4]      +1,dp[(i+1)%2][j][k][l]);}maxn=max(maxn,dp[i%2][j][k][l]);}}}}cout<<m-maxn<<endl;}return 0;
}