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


  • 相关阅读:
    serialVersionUID作用
    为什么要使用SLF4J而不是Log4J
    认识Log4j
    Java解析xml文件四种方式
    数据结构之R进制转换
    栈的压入、弹出序列
    中间件学习之RMI+JDBC远端数据库的访问
    Linux程序设计综合训练之简易Web服务器
    Html5笔记之小结
    PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题
  • 原文地址:https://www.cnblogs.com/james1207/p/3424124.html
Copyright © 2011-2022 走看看