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;
    }
  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10887279.html
Copyright © 2011-2022 走看看