zoukankan      html  css  js  c++  java
  • 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;
    }
    


  • 相关阅读:
    php将汉字转换为拼音和得到词语首字母(一)
    json字符串、json对象、数组之间的转换
    nginx配置详解(转)
    layer弹出层效果
    Ajax最详细的参数解析和场景应用
    bootstrap table使用指南
    JS的内置对象
    ThinkPHP导出CSV、Excel
    ThinkPHP的易忽视点小结
    sublime text 删除插件
  • 原文地址:https://www.cnblogs.com/james1207/p/3424124.html
Copyright © 2011-2022 走看看