题目:

这题如果没有时间限制的话暴力可以解,暴力的话时间复杂度大概是O(k*n),1s的话非常悬。

所以我们需要换个思路,我们对每个点预处理四个方向最多能走的步数,这个预处理时间复杂度是O(n*m)。

然后对每个字母点模拟一下即可。总时间复杂度O(n*m+k)。不会超时。

提示:没有满足要求的点时,要输出”no solution”,我就在这个上面WA了一次,不然应该可以一次AC的。

代码:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <queue>
using namespace std;
typedef long long ll;
#define INF 2147483647// 上N,下S,右E,左W。//输入
int n,m,k;
char a[1010][1010];
struct node1{int dir;int len;
}t[100010];//b[i][j][k]表示点(i,j)往方向k最多可以走的步数。
int b[1010][1010][4]; //字母点
struct node{int x;int y;char g;bool operator<(node b){return g < b.g;}
};
list <node> l;
list <node>::iterator it;int d[4][2] = {-1,0,1,0,0,1,0,-1};//模拟q这个点走的过程
bool can(node q) {int x = q.x;int y = q.y;for(int i = 0;i < k; i++){    node1 s = t[i];if(b[x][y][s.dir] < s.len) return false;x = x + d[s.dir][0]*s.len;y = y + d[s.dir][1]*s.len;}return true;
}int main(){//输入数据 cin >> n >> m;node e;for(int i = 1;i <= n; i++) {for(int j = 1;j <= m; j++) {cin >> a[i][j];if(a[i][j] != '#' && a[i][j] != '.'){e.x = i; e.y = j; e.g = a[i][j];l.push_back(e);}}}//对子母点按字典序排序 l.sort();for(int j = 1;j <= m; j++){//预处理每个点最多能往北边走多少步 int num = 0;for(int i = 1;i <= n; i++){if(a[i][j] != '#'){b[i][j][0] = num;num++;}else{num = 0;}}//预处理每个点最多能往南边走多少步num = 0;for(int i = n; i >= 1; i--){if(a[i][j] != '#'){b[i][j][1] = num; num++;}else{num = 0;}}}for(int i = 1; i <= n; i++){//预处理每个点最多能往东边走多少步int num = 0;for(int j = 1;j <= m; j++){if(a[i][j] != '#'){b[i][j][3] = num; num++;}else{num = 0;}}//预处理每个点最多能往西边走多少步num = 0;for(int j = m; j >= 1; j--){if(a[i][j] != '#'){b[i][j][2] = num; num++;}else{num = 0;}}}//把字母方向转换成数字表示 cin >> k;char key;for(int i = 0;i < k; i++){cin >> key >> t[i].len;if(key == 'N') t[i].dir = 0;else if(key == 'S') t[i].dir = 1;else if(key == 'E') t[i].dir = 2;else if(key == 'W') t[i].dir = 3;}//对每个子母点进行模拟 bool flag = false;for(it = l.begin();it != l.end(); it++){node q = *it;if(can(q)){cout << q.g;flag = true;}}if(!flag) cout << "no solution";cout << endl;return 0;
} 

51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))相关推荐

  1. Android百度地图(四)如何引入离线地图包

    Android百度地图(四)如何引入离线地图包 本文代码在http://blog.csdn.net/xyzz609/article/details/51955363的基础上进一步修改,有兴趣的同学可以 ...

  2. 基于Autoware制作高精地图(四)

    基于Autoware制作高精地图(四) 来了来了!它来了!肯定有小伙伴遇到过,当用Autoware导入自己制作的高精地图(也就是.csv文件)的时候会出现带有方向的车道线lane不显示的情况,或者显示 ...

  3. 电信行业大数据应用的四个方向

    引言 大数据无疑是近两年最热门的词语,"大数据"最早由全球知名咨询公司麦肯锡提出,麦肯锡认为[1]:大数据"是创新.竞争和生产力的下一个前沿领域",可以利用大数 ...

  4. Python练手项目:用中国地图验证四色地理

    根据百度百科的描述,四色问题认为"任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色.",不引起混淆的情况下一张地图只需四种颜色来标记就行.1976年6月,在美国伊利诺 ...

  5. 孟岩:想抓住EOS的机会,从这四个方向入手吧!

     整理 | 鸽子 编者注:以下内容根据CSDN副总裁.柏链道捷(PDJ Education)CEO孟岩在北京EOS沙龙上的分享整理,并获得独家授权,未经许可不得擅自转载. 在前不久举办的北京EOS ...

  6. java 地图模式_MapL 实现了百度地图定位以及感应方向和各种模式切换的 Demo Java Develop 238万源代码下载- www.pudn.com...

    文件名称: MapL下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Windows_Unix 文件大小: 5310 KB 上传时间: 2015-05-30 下载次数: 0 提 供 者 ...

  7. 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格

    地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格 ...

  8. 从四个方向来解读:当下武汉Java开发的就业前景!

    Java一直都是稳居排行榜第一的语言,在未来10年Java都会是最热门的语言之一.因为Java技术具有卓越的通用性.高效性.安全性和平台移植性,它可以跨平台的应用到不同的领域,工作需求足够大. 据不完 ...

  9. 市值跌破300亿美元!这是京东逆袭的四个方向

    11月19日,京东发布三季度财报,财报发布后的第一个交易日,京东股价重挫8.42%,第二个交易日再度下跌7.67%,那么,真的只是因为财报不佳导致的下跌吗?答案恐怕不是这么简单. 基本面不错为何下跌? ...

最新文章

  1. QT MSVC 中文报错
  2. linux7为nginx添加服务,CentOS7添加Nginx为系统服务
  3. python 文本处理2
  4. LeetCode 2155. 分组得分最高的所有下标(前缀和)
  5. Hex Workshop(16进制编辑利器) 6.7.2绿色版
  6. Redis与Redisson的分布式锁
  7. 给定一个字符串,求第一个不重复的字符
  8. 遗传算法的手工模拟计算示例(通俗易懂)(包含遗传算法原理、遗传算法代码)
  9. 改变TMQQ2009版消息提示音
  10. 使用代理IP软件需要了解的三个概念
  11. kt条件例题运筹学_运筹学讲解习题
  12. java仓库管理实验报告,基于java的仓库管理系统.doc
  13. mongoDB可视化工具Robo 3T
  14. 如何用AltiumDesigner绘制STC89C51单片机原理图
  15. HTML5UI横向排列,5个实用的UI排版技巧,让你的作品更细致
  16. webview的白屏,和硬件加速
  17. 随手写了些java题目的答案
  18. 《3D ISP核心技术算法》系列(1)——ToF测量中的多径现象与消除方法
  19. Mac电池显示需要维修
  20. 运用Python抓取二手房价格与信息的两种常用方法

热门文章

  1. Java黑皮书课后题第8章:*8.5(代数:两个矩阵相加)编写两个矩阵相加的方法,编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的和
  2. Java黑皮书课后题第2章:2.5(金融应用:计算小费)编写一个程序,读入一笔费用与小费利率,计算小费和总钱数
  3. OpenStack 存储服务 Cinder存储节点部署LVM (十四)
  4. 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP
  5. 剑指offer面试题27:二叉搜索树与双向链表
  6. 动态密码卡TOTP算法
  7. LintCode 402: Continuous Subarray Sum
  8. AD9834 DDS 使用经验
  9. o2 atom(HP rw68xx)系列手机将可以使用Android。
  10. ASP.NET AJAX + JSON 实现对象调用