Buggy Robot Gym
来源:互联网 发布:图片墙制作软件 编辑:程序博客网 时间:2024/06/08 13:42
https://vjudge.net/problem/Gym-101291C
永远的痛。。。。。
一个月前写这道题,怎么都是wa,今天早上突然想起来这道题,去看了以前的代码,md,一下就找到错误出在哪了。。。。。。
傻逼题。。。。。。。
题意:
给你一个图,给你一个已经写好的操作序列,你可以任意插入 删除修改这个序列。。 问你最少修改几次能使机器人经过终点。
这道题跟uva10047是一毛一样的。 刘汝佳的大白上有这道题。
我们可以以处理好的原操作序列为时间轴,以所用操作数为这个点的权值。
其实本质上就是把每种状态单独看成一个点,因为原操作数最多是50.
图最大也只有50*50 那么只要插入2500次(也许不止,反正可以接受就是了)就铁定能到达终点。
然后就可以跑bfs了。。 新建数组dp[i][j][k] 表示 处理完前i个原操作指令现在到达的点是j k 时的最小花费,用于剪枝。
一个月前我是直接用迪杰特斯拉写的。。。。 脑抽没想到直接跑dij会丢失最优解。。 然后怼了一整天。。。。
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<queue>#include<cmath>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define fuck(x) cout<<x<<endlint dp[55][55][55];class node{public: int step,ni,nj,w; node(int ni,int nj,int step,int w):step(step),w(w),ni(ni),nj(nj) {} bool operator < (const node& b) const { if(w==b.w) return step>b.step;// 当添加操作数一样时 优先处理原有指令消耗少的。 return w>b.w; } node() {}};int n,m;char maps[55][55];char zhiling[55];int diri[5]= {1,-1,0,0,0};int dirj[5]= {0,0,-1,1,0};int vis[2500][55][55];priority_queue<node> PQ;int dirs(char x){ if(x=='U') return 1; else if(x=='D') return 0; else if(x=='L') return 2; else if(x=='R') return 3;}bool check(node & next){ if(next.ni<0 || next.nj<0 || next.ni>=n || next.nj>=m||maps[next.ni][next.nj]=='#') return false; else { return true; }}int dij(int si,int sj,int ei,int ej,int len){ node now,next; PQ.push(node(si,sj,0,0)); while(!PQ.empty()) { now=PQ.top();PQ.pop(); if(now.w<dp[now.step][now.ni][now.nj]) { dp[now.step][now.ni][now.nj]=now.w; } else continue; if(now.step<len) { int cnt = dirs(zhiling[now.step]); next = node(now.ni+diri[cnt],now.nj+dirj[cnt],now.step+1,now.w); if(check(next))// 有没有碰壁 PQ.push(next); else PQ.push(node(now.ni,now.nj,now.step+1,now.w));// 碰壁之后 next=node(now.ni,now.nj,now.step+1,now.w+1);//删除这一步,在原地不动 if(check(next)) { PQ.push(next); } } //cout<<vis[2][0][2]<<endl; for(int i=0; i<4; i++)//往四个方向增加一个指令 { next = node(now.ni+diri[i],now.nj+dirj[i],now.step,now.w+1); if(check(next)) { PQ.push(next); } } }}int main(){ cin>>n>>m; memset(dp,0x3f,sizeof dp); int si,sj,ei,ej; for(int i=0; i<n; i++) scanf("%s",maps[i]); for(int i=0; i<n; i++) { for(int j = 0; j<m; j++) { if(maps[i][j] == 'R') { si=i; sj=j; } else if(maps[i][j] == 'E') { ei=i; ej=j; } } } scanf("%s",zhiling); int len=strlen(zhiling); int ans=0x3f3f3f3f; dij(si,sj,ei,ej,len); for(int i=0;i<=len;i++) ans=min(ans,dp[i][ei][ej]); cout<<ans<<endl;}
阅读全文
0 0
- Buggy Robot Gym
- Buggy Robot Gym
- UVA Live 7693 (Codeforces Gym 101201B) Buggy Robot DP+bfs
- B. Buggy Robot
- Buggy Robot (二维压一维最短路
- CodeForces 888B Buggy Robot
- codeforces 893B. Buggy Robot
- Codeforces 888B Buggy Robot (模拟)
- Educational Codeforces Round 32 B. Buggy Robot(模拟)
- GYM 100182 H.Robot Challenge(dp)
- GYM 101102 I.Simple Robot(水~)
- Buggy Sorting
- Gym
- Gym
- Gym
- Gym
- Gym
- Gym
- spark(5)--spark模型中FIFO的实现
- hdu 2896 ac自动机
- lintcode——买卖股票的最佳时机
- 2017.08.22 今日头条笔试题
- MyBatis(1)--MyBatis入门示例
- Buggy Robot Gym
- Guava Cache源码解析
- 智能停车场解决方案
- 按钮组件
- Awesome Chrome 插件集锦
- IDEA的选项翻译
- python3 学习笔记
- 8月22日开发笔记
- lightoj1072