1572 宝岛地图 

题目来源: CodeForces

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

 收藏

 关注

勇敢的水手们到达了一个小岛,在这个小岛上,曾经有海盗在这里埋下了一些宝藏。然而,我们的船快抛锚了,与此同时,船长发现藏宝图的一角被老鼠咬掉了一块。

藏宝图可以用一个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示例

输入样例1
6 10
##########
#K#..#####
#.#..##.##
#..L.#...#
###D###A.#
##########
4
N 2
S 1
E 1
W 2

Output示例

输出样例1
AD

#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<iomanip>
#include<algorithm>
#include<stack>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
char ch[1005][1005];
int sum[1005][1005];
int n,m;
int KK;
char dir[100005];
int d[100005];
vector<char>vec;
int getsum(int i,int j,int x,int y)
{
return sum[x][y]-sum[i-1][y]-sum[x][j-1]+sum[i-1][j-1];
}
bool dfs(int i,int j,int k)
{
if(i<0||i>=n||j<0||j>=m||ch[i][j]=='#')return 0;
if(k==KK+1)return 1;
int x=i,y=j;
if(dir[k]=='N')x=i-d[k];
else if(dir[k]=='S')x=i+d[k];
else if(dir[k]=='W')y=j-d[k];
else if(dir[k]=='E')y=j+d[k];
if(getsum(min(i,x)+1,min(j,y)+1,max(i,x)+1,max(j,y)+1)>0)return 0;
return dfs(x,y,k+1);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf(" %c",&ch[i][j]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(ch[i][j]=='#')sum[i+1][j+1]=sum[i+1][j]+sum[i][j+1]-sum[i][j]+1;
else sum[i+1][j+1]=sum[i+1][j]+sum[i][j+1]-sum[i][j];
}
} scanf("%d",&KK);
for(int i=0;i<KK;i++)scanf(" %c%d",&dir[i],&d[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(ch[i][j]>='A'&&ch[i][j]<='Z')
{
if(dfs(i,j,0))vec.push_back(ch[i][j]);
}
}
}
if(vec.size()==0)cout<<"no solution"<<endl;
else {
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++)cout<<vec[i];
cout<<endl;
}
return 0;
}

最新文章

  1. jQuery下拉框扩展和美化插件Chosen
  2. ilbc编解码
  3. Labeling Balls 分类: POJ 2015-07-28 19:47 10人阅读 评论(0) 收藏
  4. Java String 一些实验
  5. mysqldump原理1
  6. bzoj 2286 [Sdoi2011]消耗战(虚树+树上DP)
  7. Android的TextView与Html相结合的用法
  8. Android开发过程中git、repo、adb、grep等指令的使用
  9. bootstrap中可用的图标集
  10. 《Python数据分析常用手册》一、NumPy和Pandas篇
  11. 【转】jQuery代码片段备用
  12. 巧用CAS解决数据一致性问题
  13. SpringBoot系列——花里胡哨的banner.txt
  14. 使用Spring配置数据源JdbcTemplate
  15. Dos命令讲解
  16. GO语言的进阶之路-goroutine(并发)
  17. 如何用jQuery获得select的值
  18. SQLServer2005 CASE WHEN在项目中实例-查询显示值替换
  19. JQuery 自己主动触发事件
  20. 《Linux内核设计与实现》学习总结 Chap4

热门文章

  1. Java:关于子类继承父类接口时,由于权限没有设定的更广,出错的一个小tip
  2. 从cbv到fbv:用函数写视图与用类写视图的区别(drf与restful)
  3. 适合新手的160个creakme(二)
  4. MyBatis学习存档(3)——mapper.xml映射文件
  5. 【广搜】Knight Moves
  6. css对应rgb码表16进制
  7. 安卓开发之获取SD卡空间数据
  8. mysql 获取表字段说明SQL
  9. 【转载】interpolation(插值)和 extrapolation(外推)的区别
  10. 01_Redis简述