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; }