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