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

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


 

 

你可能感兴趣的:(dp)