zoukankan      html  css  js  c++  java
  • P1859 不听话的机器人

    题目描述

    机器人收到N条指令,但它不想走到障碍物上或走出边界,所以决定拒绝一些指令。求最少拒绝多少条指令?

    FORWARD前进1

    BACK后退1

    LEFT左转90度

    RIGHT右转90度

    输入输出格式

    输入格式:

    第一行M|100、N|1000、X0、Y0,M*M场地,N条指令起点(X0,Y0) 接下来一个M*M矩阵,表示场地。.为场地,*为障碍物

    接下来N行,表示N条命令

    输出格式:

    一个数,表示最少拒绝多少条命令

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,xx,yy;
    int dp[102][102][4][501];
    
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    string s;
    char mp[120][120];
    int main()
    {
        memset(dp,127,sizeof(dp));
        cin>>m>>n>>xx>>yy;
        dp[xx][yy][3][0]=0;
        for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
        cin>>mp[i][j];
        for(int i=1;i<=n;i++)
        {
            cin>>s;
            char tk=s[0];
            if(tk=='L')
            {
                for(int x=1;x<=m;x++)
                for(int y=1;y<=m;y++)
                for(int l=0;l<=3;l++)
                dp[x][y][l][i]=min(dp[x][y][l][i-1]+1,dp[x][y][(l+1)%4][i-1]);
                
            }
            if(tk=='R')
            {
                for(int x=1;x<=m;x++)
                for(int y=1;y<=m;y++)
                for(int l=0;l<=3;l++)
                dp[x][y][l][i]=min(dp[x][y][l][i-1]+1,dp[x][y][(l+3)%4][i-1]);
            }
            if(tk=='F')
            {
                for(int x=1;x<=m;x++)
                for(int y=1;y<=m;y++)
                for(int l=0;l<=3;l++)
                dp[x][y][l][i]=min(dp[x][y][l][i-1]+1,dp[x-dx[l]][y-dy[l]][l][i-1]);
                
                for(int x=1;x<=m;x++)
                for(int y=1;y<=m;y++)
                for(int l=0;l<=3;l++)if(mp[x][y]=='*')
                dp[x][y][l][i]=0x3f3f3f3f;
            }
            if(tk=='B')
            {
                for(int x=1;x<=m;x++)
                for(int y=1;y<=m;y++)
                for(int l=0;l<=3;l++)
                dp[x][y][l][i]=min(dp[x][y][l][i-1]+1,dp[x+dx[l]][y+dy[l]][l][i-1]);    
                for(int x=1;x<=m;x++)
                for(int y=1;y<=m;y++)
                for(int l=0;l<=3;l++)
                if(mp[x][y]=='*')
                dp[x][y][l][i]=0x3f3f3f3f;
            }
            
            
        }
        int ans=0x3f3f3f3f;
        for(int x=1;x<=m;x++ )
        for(int y=1;y<=m;y++)
        for(int l=0;l<=3;l++)
        ans=min(ans,dp[x][y][l][n]);
        cout<<ans;
    }
  • 相关阅读:
    13.解决SUSELinux用户登录Module is unknow问题
    12.解决SUSE Linux无法使用SSH登录的问题
    11.SUSE Linux服务器系统网卡配置重启问题
    02.Windows2012R2安装360安全卫士失败及无法卸载问题
    01.Windows2008R2系统禁启SMBv1服务命令
    07.SUSE Linux 系统本地yum源配置
    06.Linux-RedHat系统本地yum源配置
    05.Linux-CentOS系统本地Yum源搭建
    04.Linux-CentOS系统sudo权限配置
    03.LinuxCentOS系统root目录LVM磁盘扩容
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10887279.html
Copyright © 2011-2022 走看看