51nod 1572 宝岛地图(前缀和)
来源:互联网 发布:淘宝导航栏隐藏代码 编辑:程序博客网 时间:2024/04/30 00:33
勇敢的水手们到达了一个小岛,在这个小岛上,曾经有海盗在这里埋下了一些宝藏。然而,我们的船快抛锚了,与此同时,船长发现藏宝图的一角被老鼠咬掉了一块。
藏宝图可以用一个n×m大小的矩形表示。矩形中的每一小块表示小岛中的一小块陆地(方块的边长为1米)。有一些方块表示的是海,这些块人是不能通过的。除了海不能走,其它的小方块都是可以行走的。在可行走区域里有一些小方块表示一些已知的地点。
另外,在地图上有k条指令。每条指令的格式表示如下:
“向y方向走n米”。
这里的方向有四种:“北”,“南”,“东”,“西”。如果你正确的跟着这些指令行走,并且完整的执行完所有指令,你就可以找到宝藏所在的地点。
但是,很不幸,由于地图中好多地方都缺失了,船长也不知道从哪些地方开始走。但是船长依然清楚地记得一些已知的地点。另外,船长也知道所有可行走区域。
现在船长想知道从哪些已知地点出发,按照指令,可能找到宝藏所在地。
Input
单组测试数据第一行包含两整数n和m(3≤n,m≤1000)。接下来的n行每行有m个字符,表示整个地图。“#”代表海。在地图矩形中,矩形的四周一圈一定是海。“.”代表可行走区域,未知地点。大写字母“A”到“Z”表示可行走区域,已知地点。所有大写字母不一定都被用到。每个字母在地图中最多出现一次。所有已知地点用不同的大写字母表示。接下来一行有一个整数k(1≤k≤10^5),接下来有k行。每行表示一条指令。指令格式为“dir len”,“dir”表示朝哪个方向走,“len”表示走几步。“dir”有四种取值“N”,“S”,“E”,“W”,对应题目中的“北”,“南”,“东”,“西”在地图中,北是在顶部,南是在底部,西是在左边,东是在右边。“len”是一个整数,范围在[1,1000]。
Output
共一行,按字典序升序打印出所有可以完整执行地图中指令的已知区域的字母,如果没有满足要求的已知区域,则打印“no solution”(没有引号)。
Input示例
输入样例16 10###########K#..######.#..##.###..L.#...####D###A.###########4N 2S 1E 1W 2
Output示例
输出样例1AD
思路:最多26个字母,每个字母操作1e5次,可以用前缀和判断下一个命令是否合法,可走的位置都为1,不可走的为0,若两步之间1的数量不等于len+1即位非法。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn = 1e3+5;const int maxm = 1e5+5;char str[maxn][maxn], ans[maxn];int sum[2][maxn][maxn], n, m;int cmd[maxm], len[maxm];int main(void){ while(cin >> n >> m) { for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf(" %c", &str[i][j]); memset(sum, 0, sizeof(sum)); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { sum[0][i][j] = sum[0][i][j-1]; if(str[i][j] != '#') sum[0][i][j]++; } for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) { sum[1][j][i] = sum[1][j-1][i]; if(str[j][i] != '#') sum[1][j][i]++; } int cnt = 0, k; scanf("%d", &k); for(int i = 1; i <= k; i++) { char ch; int t; scanf(" %c%d", &ch, &len[i]); if(ch == 'N') t = 0; if(ch == 'S') t = 1; if(ch == 'W') t = 2; if(ch == 'E') t = 3; cmd[i] = t; } for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { if(str[i][j] >= 'A' && str[i][j] <= 'Z') { bool ok = 1; int x = i, y = j; for(int z = 1; z <= k; z++) { int prex = x, prey = y; if(cmd[z] == 0) { x -= len[z]; if(x < 1 || sum[1][prex][prey]-sum[1][x-1][y] != len[z]+1) { ok = 0; break; } } if(cmd[z] == 1) { x += len[z]; if(x > n || sum[1][x][y]-sum[1][prex-1][prey] != len[z]+1) { ok = 0; break; } } if(cmd[z] == 2) { y -= len[z]; if(y < 1 || sum[0][prex][prey]-sum[0][x][y-1] != len[z]+1) { ok = 0; break; } } if(cmd[z] == 3) { y += len[z]; if(y > m || sum[0][x][y]-sum[0][prex][prey-1] != len[z]+1) { ok = 0; break; } } } if(ok) ans[cnt++] = str[i][j]; } } sort(ans, ans+cnt); for(int i = 0; i < cnt; i++) printf("%c", ans[i]); if(!cnt) printf("no solution"); puts(""); } return 0;}
阅读全文
1 0
- 51nod 1572 宝岛地图(前缀和)
- 51Nod-1572-宝岛地图
- 51nod 1572 宝岛地图
- 宝岛地图 (51Nod-1572)
- 51nod 1572 宝岛地图(思维)
- 51NOD 1572 宝岛地图(dp+优先队列)
- 51nod 1572宝岛地图(动态规划预处理+模拟)
- 15nod1572-模拟&前缀和&枚举-宝岛地图
- 51nod 1344 【前缀和】
- 宝岛地图
- 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))
- 51nod 1087 前缀和 STL lower_bound
- 51 nod 1682 中位数计数(前缀和)
- 暑假Fourteen宝岛地图
- 宝岛地图(dp)
- 51nod 1065 最小正子段和(前缀和)
- [杜教筛 约数和前缀和] 51Nod 1220 约数之和
- 51nod 1393 0和1相等串(前缀和)
- 金融云:让中小银行“拎包入住”,快速上云
- jmeter:测试网站在负载达到20 QPS时的响应时间
- 【python】判断key是否存在于dict
- 科目二考试总结
- centos 7搭建java环境,并且运行helloworld
- 51nod 1572 宝岛地图(前缀和)
- Redis常用命令
- 智能指针(二):shared_ptr实现原理
- Delphi容器类之---TList、TObjectList、TComponentList、TClassList的使用
- Spring 与MQTT的结合
- linux 下查看日志文件的操作命令
- Android基础知识(一)
- android动态设置控件的各种属性
- react-navigation自定义StackNavigator页面跳转动画