http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4092

C++版本一

题解:

1、有个东西叫%1d;

2、哈希坐标;

3、剪枝;

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
//#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=2000+100;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m;
ll k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a,b,mp[N][N];
int vis[N][300];
char str[N],str1[N];
struct node{int x,y,step;
}tmp,start,front1;
int command(int x,int y){return 81*mp[x][y]+27*mp[x-1][y]+9*mp[x+1][y]+3*mp[x][y-1]+mp[x][y+1];
}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);scanf("%d%d%lld",&a,&b,&k);scanf("%s",str);sum=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%1d",&mp[i][j]);if(mp[i][j]==2)sum++;}}start.x=a;start.y=b;start.step=0;memset(vis,-1,sizeof(vis));ans=0;front1=start;while(1){int opid=command(front1.x,front1.y);char op=str[opid];if(vis[(front1.x-1)*m+front1.y][opid]==ans)break;if(sum<=ans)break;vis[(front1.x-1)*m+front1.y][opid]=ans;tmp=front1;tmp.step++;if(tmp.step>k)break;//cout<<front1.x<<" "<<front1.y<<" "<<op<<" "<<mp[front1.x][front1.y]<<" "<<vis[front1.x][front1.y]<<endl;if(op=='U'){tmp.x--;}else if(op=='D'){tmp.x++;}else if(op=='L'){tmp.y--;}else if(op=='R'){tmp.y++;}else if(op=='P'){if(mp[front1.x][front1.y]==2){mp[front1.x][front1.y]=0;ans++;}}else if(op=='I'){break;}if(mp[tmp.x][tmp.y]==1){break;}front1=tmp;}printf("%d\n",ans);}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

C++版本二

题解:注意标记,vis[i][j] i表示对坐标的哈希,j表示当前计算的x,值为之前得到多少汽油了,因为如果再次经过这个位置,两次经过的中间得到多汽油,并且改变了图中的2,所以要继续走,知道,走到一个位置,汽油数不增加,然后就是注意一些剪枝。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a,b;
ll k;
char mp[2010][2010];
int vis[2100][255];
char step[255];
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);scanf("%d%d%lld",&a,&b,&k);scanf("%s",step+1);int sum=0;for(int i=0;i<=n*m;i++)for(int j=0;j<=250;j++)vis[i][j]=-1;for(int i=1;i<=n;i++){scanf("%s",mp[i]+1);for(int j=1;j<=m;j++){if(mp[i][j]=='2')sum++;}}int ans=0;int x;int xx,yy;int st=0;while(1){x=81*(mp[a][b]-'0')+27*(mp[a-1][b]-'0')+9*(mp[a+1][b]-'0')+3*(mp[a][b-1]-'0')+(mp[a][b+1]-'0');if(vis[(a-1)*m+b][x]==ans) break;vis[(a-1)*m+b][x]=ans;x++;// cout<<a<<" "<<b<<" "<<x<<" "<<step[x]<<" "<<endl;if(step[x]=='U') xx=a-1,yy=b;if(step[x]=='D') xx=a+1,yy=b;if(step[x]=='L') xx=a,yy=b-1;if(step[x]=='R') xx=a,yy=b+1;if(step[x]=='P') {if(mp[a][b]=='2'){ans++;mp[a][b]='0';   } if(ans>=sum) break;xx=a,yy=b;}if(step[x]=='I') {xx=a,yy=b;break;}if(mp[xx][yy]=='1') break;st++;if(st==k) break;a=xx;b=yy;}printf("%d\n",ans);}return 0;
}

Robot Cleaner I相关推荐

  1. LeetCode 489. Robot Room Cleaner--C++,Python解法

    题目地址:Robot Room Cleaner - LeetCode Given a robot cleaner in a room modeled as a grid. Each cell in t ...

  2. B. Game on Ranges

    目录 B. Game on Ranges A. Robot Cleaner B. Game on Ranges 原题描述 题意理解(建议先自己把原题描述看一遍再来看我的理解) 有一个集合,这个集合的元 ...

  3. The 19th Zhejiang University Programming Contest Sponsored by TuSimple

    Problem A Thanks, TuSimple! 比赛地址:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5 ...

  4. CodeForces - 589J Cleaner Robot

    J. Cleaner Robot time limit per test2 seconds memory limit per test512 megabytes inputstandard input ...

  5. 【Codeforces 922D】Robot Vacuum Cleaner

    [链接] 我是链接,点我呀:) [题意] 让你把n个字符串重新排序,然后按顺序连接在一起 使得这个组成的字符串的"sh"子序列最多 [题解] /** 假设A的情况好于B* 也就对应 ...

  6. CodeForces 589J Cleaner Robot

    题目链接 题意:一个机器人打扫卫生,URDL代表初始时机器人面对的方向上右下左. ' . ' 代表可以打扫的, ' * ' 代表家具,如果机器人遇到家具就顺时针转90度,问机器人能打扫多少面积. 题解 ...

  7. CF922D Robot Vacuum Cleaner 贪心+排序

    正确的贪心方法:按照比例排序. code: #include <bits/stdc++.h> #define N 200000 #define ll long long #define s ...

  8. 一些关于ROS的讨论 Robot Operating System – A flexible framework for writing robot software (ros.org)

    https://news.ycombinator.com/item?id=17916456 Robot Operating System – A flexible framework for writ ...

  9. Robot Framework(十八) 支持工具

    5支持工具 5.1库文档工具(libdoc) libdoc是一种用于为HTML和XML格式的测试库和资源文件生成关键字文档的工具.前一种格式适用于人类,后者适用于RIDE和其他工具.Libdoc也没有 ...

最新文章

  1. 视频批量转换为FLV的软件开发总结(1)——思想总结篇
  2. 简单例子解释invalidate(), requestLayout() (常用还是需要知道的)
  3. dataframe iloc_DataFrame
  4. 一次.net托管内存泄露分析
  5. [JavaWeb-HTML]HTML标签_文本标签_练习
  6. 【飞秋教程】文件断点续传
  7. P1629 邮递员送信(正反向建图 or 暴力)
  8. mysql管理系统需求分析_教学管理系统需求分析报告
  9. 我很喜欢电影背后这个看上去很精神分裂的故事,跟影片中那个盘根错节的故事相得益彰。好的艺术作品永远都不可能被简化成纬度单一的说教。
  10. Axure实战002:APP原型设计思路
  11. AN学习笔记,代码访问影片剪辑内部的子影片剪辑
  12. High Performance Visual Tracking with Siamese Region Proposal Network 论文学习
  13. 看板游戏——叠纸飞机
  14. OpenCloner Ripper:集光盘翻录软件+光盘视频转换+光盘解密于一体的全能光盘工具
  15. LeetCode20.有效的括号——纯C
  16. 《Unity Shader 入门精要》读书笔记
  17. 单链表存储一元多项式[IMUT 数据结构实验]
  18. Windows域环境使用教程实验
  19. 【小程序】表单form示例(图文+代码)
  20. 博图软件搜索不到网卡

热门文章

  1. oracle dg状态查询,oracle dg状态检查及相关命令
  2. oracle spool .dbf,oracle技术之oracle spool的简单使用
  3. gradle exclude_Gradle学习记录020 java工程的测试 part1
  4. 提取点的dn值_干货在线 | DEM数据如何生成高程点
  5. python安装vpython_VPython:一个Python的3D图形动画库+被忽略的数据可视化功能
  6. 幼儿园带括号算式口诀_记忆口诀丨有顺口溜加成的知识点瞬间好记一万倍!
  7. 2008 mysql 本地安全_如何在Linux系统中建立mysql的本地安全机制?
  8. linux下的arm仿真,使用QEMU仿真ARM Linux系统
  9. android tomtom gps location,TomTom智能地图修正 规避不能走的路
  10. oracle触发器 select into,Oracle触发器中selectinto报错no_data_found异常处理