题目:

这题如果没有时间限制的话暴力可以解,暴力的话时间复杂度大概是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. 使用 async/ await 进行 异步 编程

    一.异步函数 异步函数概念. 通常 是 指用 async 修饰 符 声明 的, 可 包含 await 表达式 的 方法 或 匿名 函数 1. 从 语言 的 视角 来看, 这些 await 表达式 正是 ...

  2. 读书笔记之《HTML5 与 CSS3 基础教程》

    1· 读前预期 考虑到对于 Web 开发零基础,凡涉足一件未知的任务,最好先理清任务的逻辑结构,然后有目的地逐步学习.为实现我们的需求和设计,必须要学习前端.后端.服务器等一系列暂时陌生的知识,在此, ...

  3. c# ExecuteScalar()

    ExecuteScalar这个方法是从数据库中检索单个值返回值是object类型,必须用与它在数据库里存放的类型相同类型或者可以转换成的类型,比如数据是nchar类型值为 "123" ...

  4. 脚本_统计每个远程IP访问本机apache的次数

    #!bin/bash#功能:统计每个远程IP访问本机apache的次数#作者:liusingbonawk '{ip[$1]++} END{for(i in ip){print ip[i],i}}'  ...

  5. C++介绍与入门学习

    C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计.C++擅长面向对象程序设计的同时,还可以 ...

  6. 解决MYSQL的错误:Got a packet bigger than 'max_allowed_packet' bytes

    Mysql 5.1开始遇到的信息包过大问题,当用客户端导入数据的时候,遇到错误代码: 1153 - Got apacket bigger than 'max_allowed_packet' bytes ...

  7. easyUI combobox的使用

    1.需要用到的方法 设置组合框(combobox)值的数组. $('#cc').combobox('setValues', ['001','002']); 设置组合框(combobox)的值. $(' ...

  8. Lapack下载安装

    安装 1.下载压缩文件 wget http://www.netlib.org/lapack/lapack-3.8.0.tar.gz 2.解压缩 tar -zxvf lapack-3.8.0.tar.g ...

  9. STM32 关于HAL库硬件SPI要注意的问题总结

    利用STM32CUbeMx编写程序,大大方便了开发,最近做的项目利用到了 STM32CUbeMx的硬件SP,这里对SPI的使用做一个总结. HAL库里的硬件SPI主要有以下几个库函数: /* hspi ...

  10. 4.AND,OR

    4.WHERE中使用AND,OR连接多个过滤条件      AND:并且的关系,要求条件同时满足    OR:或者的关系,要求条件满足某一个就可以     //查询10部门,基本工资大于2000的员工 ...