题目:

这题如果没有时间限制的话暴力可以解,暴力的话时间复杂度大概是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[][];
struct node1{
int dir;int len;
}t[]; //b[i][j][k]表示点(i,j)往方向k最多可以走的步数。
int b[][][]; //字母点
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[][] = {-,,,,,,,-}; //模拟q这个点走的过程
bool can(node q) {
int x = q.x;int y = q.y;
for(int i = ;i < k; i++){
node1 s = t[i];
if(b[x][y][s.dir] < s.len) return false;
x = x + d[s.dir][]*s.len;
y = y + d[s.dir][]*s.len;
}
return true;
} int main(){
//输入数据
cin >> n >> m;
node e;
for(int i = ;i <= n; i++) {
for(int j = ;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 = ;j <= m; j++){
//预处理每个点最多能往北边走多少步
int num = ;
for(int i = ;i <= n; i++){
if(a[i][j] != '#'){
b[i][j][] = num;num++;
}else{
num = ;
}
}
//预处理每个点最多能往南边走多少步
num = ;
for(int i = n; i >= ; i--){
if(a[i][j] != '#'){
b[i][j][] = num; num++;
}else{
num = ;
}
}
} for(int i = ; i <= n; i++){
//预处理每个点最多能往东边走多少步
int num = ;
for(int j = ;j <= m; j++){
if(a[i][j] != '#'){
b[i][j][] = num; num++;
}else{
num = ;
}
}
//预处理每个点最多能往西边走多少步
num = ;
for(int j = m; j >= ; j--){
if(a[i][j] != '#'){
b[i][j][] = num; num++;
}else{
num = ;
}
}
} //把字母方向转换成数字表示
cin >> k;
char key;
for(int i = ;i < k; i++){
cin >> key >> t[i].len;
if(key == 'N') t[i].dir = ;
else if(key == 'S') t[i].dir = ;
else if(key == 'E') t[i].dir = ;
else if(key == 'W') t[i].dir = ;
} //对每个子母点进行模拟
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 ;
}

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

  1. 51nod 1572 宝岛地图

    题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 勇敢的水手们到达了一个小岛,在这个小岛上,曾经有海盗在这里埋下了一些宝藏.然而,我 ...

  2. 51 Nod 1572 宝岛地图

    1572 宝岛地图  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 勇敢的水手们到达了一个小岛,在这个小岛上,曾 ...

  3. QDUOJ 东北大炸弹 宝岛地图-枚举+数组记录+前缀和

    冰清玉洁丶YCB 发布时间: 2017年6月18日 21:39   最后更新: 2017年6月18日 21:40   时间限制: 1000ms   内存限制: 256M 描述 YCB是公认的冰清玉洁, ...

  4. C#的百度地图开发(四)前端显示与定位

    原文:C#的百度地图开发(四)前端显示与定位 有了这些定位信息,那要如何在前端的页面上显示出来呢?这需要用到百度地图的JavaScript的API.下面是示例代码. 前端代码 <%@ Page  ...

  5. JS用斜率判断鼠标进入DIV四个方向的方法 判断鼠标移入方向

    本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路.这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的.这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识, ...

  6. Android自定义组件——四个方向滑动的菜单实现

    今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...

  7. Android自定义组件系列【15】——四个方向滑动的菜单实现

    今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...

  8. CSU 1508:地图的四着色(DFS+剪枝)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1508 题意:地图中四联通的块是一个国家,A和B每个人可以涂两种颜色,且B不能涂超过5次,相邻的国家 ...

  9. 关于Yahoo十四条军规与前端性能优化

    关于Yahoo十四条军规与前端性能优化 热度 4已有 223 次阅读2014-8-3 15:01 |个人分类:前端相关|系统分类:前端优化| 前端优化, yahoo, 性能优化 启用Gzip压缩.Gz ...

随机推荐

  1. Response.Redirect(),Server.Transfer(),Server.Execute()的区别与网站优化

    转 http://blog.csdn.net/dannywj1371/article/details/10213631 1.Response.Redirect():Response.Redirect方 ...

  2. Linux 系列- 基本命令

    Linux 基本命令 转自:http://www.taobaotest.com/blogs/qa?bid=353 Linux是一个基于命令的系统,它有很多很强的命令. 但它也有桌面系统,比如KDE, ...

  3. DateTime? 定义的日期变量如何format

    DateTime? dateTime; dateTime.Value.ToString("yy-MM-dd")

  4. Centos7 minimal 系列之Nginx搭建(三)

    一.安装nginx 1.1.安装依赖包 yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-d ...

  5. c/s winform打包和部署

    1:vs2010新建  安装项目  左边出现3个文件夹 2:点击 第一个文件夹-> “应用程序文件夹”    将 bin 目录下的所以文件  拖进 右边的空白处:c:\windows\syste ...

  6. 1到32 数字正则 还有IP的

    正则是按位解析匹配的,所以[1-32]是不行的. 解析: 1.1-32,包含1位数(1-9)和2位数(10-32) 2.10-32必须切割,10-19和20-29形式一样,得到[12][0-9],30 ...

  7. input[type='file']获取上传文件路径案例

    最近在项目时,需要获取用户的上传文件的路径,便写了一个demo: <body> <input type="file" name="" valu ...

  8. Day 02 - 01 计算机的操作系统

    操作系统 场景:有以下三个人 1.庄园主 -->相当于人类 2.管家 --> 把人类要传达的信息分配给奴隶,相当于操作系统 3.奴隶 -->为人类干活的机器 1.操作系统做了什么? ...

  9. 51nod-字符串连接

    输入n个字符串s[i],你要把他们按某个顺序连接起来,使得字典序最小. (1 <= n <= 100) (每个字符串长度 <= 100) (字符串只包含小写字母) Input 第一行 ...

  10. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...