1026 逃跑的拉尔夫

 时间限制: 1 s
 
 空间限制: 128000 KB
 
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description
 

年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。

那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。

编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。

小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。

汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。

拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。

输入描述 Input Description

输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。

以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。

接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。

接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。

输出描述 Output Description

输出文件应包含用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。

样例输入 Sample Input
 

4 5

.....

.X...

...*X

X.X..

3

NORTH

WEST

SOUTH

样例输出 Sample Output

.....

*X*..

*.*.X

X.X..

 
 
思路:
  大搜索
  地图范围50*50
  不搜索对不起出题人
  所以我刚开始打了一个深搜
  结果只有30分,其余全超时
  然后我又认真读了一遍题目
  又加了一个判断状态相同的剪枝
  结果第十个点re
  然后觉得可能是深搜的问题
  所以我又写了一个广搜的代码
  结果第十个点又wa了
  看了好久没看出来到底拿错了
  于是请hyxzc神犇来帮忙看一下
  hyxzc一看是道这么水的题
  本不想写代码的
  但是在我的苦苦哀求下
  边骂我没出息边给我敲代码
  然后我看了他的代码风格又写了一个代码
 
 
来,上代码:
 
  hyxzc:

#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#define maxn 1000+100
#define INF 0x7fffffff
#define M 100 using namespace std; int read()
{
int x=;
char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x;
} struct ss
{
int x,y,z;
ss () {}
ss (int x_,int y_,int z_) {x=x_,y=y_,z=z_;}
}; queue<ss>que; int vis[maxn][M][M],map[maxn][maxn],Sx,Sy,fx[maxn],n,m,q;
char ch[];
int xx[]={,-,,};
int yy[]={,,,-}; int turn(char x)
{
if (x=='*') return INF;
if (x=='.') return ;
return ;
} int Turn(char x)
{
if (x=='N') return ;
if (x=='S') return ;
if (x=='E') return ;
if (x=='W') return ;
} char turn(int x)
{
if (x==INF) return '*';
if (x==) return '.';
return 'X';
} int check(int x,int y)
{
if (x>&&x<n+&&y>&&y<m+) return ;
return ;
} int bfs()
{
vis[][Sx][Sy]=;
que.push(ss(Sx,Sy,));
for (int i=;i<=q;i++)
{
while (que.front().z==i)
{
ss now=que.front();que.pop();
while (check(now.x+xx[fx[i]],now.y+yy[fx[i]])&&map[now.x+xx[fx[i]]][now.y+yy[fx[i]]])
{
now.x+=xx[fx[i]],now.y+=yy[fx[i]];
if (!vis[i+][now.x][now.y]) que.push(ss(now.x,now.y,i+)),vis[i+][now.x][now.y]=;
}
}
}
} int main()
{
n=read(),m=read();
for (int i=;i<=n;i++)
{
scanf("%s",ch);
for (int j=;j<=m;j++)
{
map[i][j]=turn(ch[j-]);
if (map[i][j]==INF) {Sx=i;Sy=j;map[i][j]=;}
}
}
q=read();
for (int i=;i<=q;i++)
{
scanf("%s",ch);
fx[i]=Turn(ch[]);
}
bfs();
while (!que.empty())
{
ss now=que.front();que.pop();
map[now.x][now.y]=INF;
}
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++) cout<<turn(map[i][j]);
cout<<endl;
}
return ;
}

(其实很恶心的说)

我的:

#include<queue>
#include<cstdio>
#include<iostream> #define INF 0x7fffffff using namespace std; struct node {
int x,y,step;
node () {}
node (int x_,int y_,int step_) {x=x_,y=y_,step=step_;}
};
struct node now; const int dx[]={,-,,,};
const int dy[]={,,,,-}; int n,m,map[][],sx,sy,q,orientation[]; char cur[]; bool flag[][][]; queue<struct node>que; int turn_charinint(char x)
{
if(x=='X') return ;
if(x=='.') return ;
if(x=='N') return ;
if(x=='S') return ;
if(x=='W') return ;
if(x=='E') return ;
return INF;
} char turn_intinchar(int x)
{
if(x==INF) return '*';
if(x==) return 'X';
else return '.';
} bool ok()
{
if(now.x+dx[orientation[now.step]]<=n&&now.x+dx[orientation[now.step]]>)
if(now.y+dy[orientation[now.step]]<=m&&now.y+dy[orientation[now.step]]>)
if(map[now.x+dx[orientation[now.step]]][now.y+dy[orientation[now.step]]])
return true;
return false;
} void bfs()
{
que.push(node(sx,sy,));
flag[sx][sy][]=true;
for(int i=;i<=q;i++)
{
while(que.front().step==i)
{
now=que.front();
que.pop();
while(ok())
{
now=node(now.x+dx[orientation[now.step]],now.y+dy[orientation[now.step]],now.step);
if(flag[now.x][now.y][now.step+]) continue;
que.push(node(now.x,now.y,now.step+));
flag[now.x][now.y][now.step+]=true;
}
}
}
} int main()
{
//scanf("%d%d",&n,&m);
cin>>n>>m;
for(int i=;i<=n;i++)
{
//scanf("%s",cur);
cin>>cur;
for(int j=;j<=m;j++)
{
map[i][j]=turn_charinint(cur[j-]);
if(map[i][j]==INF)
{
sx=i,sy=j;
map[i][j]=;
}
}
}
//scanf("%d",&q);
cin>>q;
for(int i=;i<=q;i++)
{
cin>>cur;
orientation[i]=turn_charinint(cur[]);
}
bfs();
while(!que.empty())
{
now=que.front();
que.pop();
map[now.x][now.y]=INF;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
putchar(turn_intinchar(map[i][j]));
}
putchar('\n');
}
return ;
}
 

AC日记——逃跑的拉尔夫 codevs 1026 (搜索)的更多相关文章

  1. AC日记——接龙游戏 codevs 1051

    1051 接龙游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...

  2. AC日记——地鼠游戏 codevs 1052

    1052 地鼠游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...

  3. AC日记——鬼谷子的钱袋 codevs 2998

    2998 鬼谷子的钱袋 2006年省队选拔赛湖南  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master    题目描述 Description 鬼谷子非常聪明,正 ...

  4. AC日记——舒适的路线 codevs 1001 (并查集+乱搞)

    1001 舒适的路线 2006年  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description Z小镇是 ...

  5. AC日记——自然数和分解 codevs 2549

    自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...

  6. AC日记——郁闷的出纳员 codevs 1286

    郁闷的出纳员 思路: 设工资下限为ko,然后ko--(因为要小于工资下限): 设cur为记录工资增长,降低: 设第i个人的工资为pos: 对应的四种操作: 插入:cur-pos-ko: 增长:cur- ...

  7. AC日记——营业额统计 1296 codevs

    1296 营业额统计 2002年  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description Tiger ...

  8. AC日记——花店橱窗布置 codevs 1028

    题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...

  9. AC日记——最优贸易 codevs 1173

    题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...

随机推荐

  1. java微信开发(wechat4j)——支持微信JS-SDK的jsapi_ticket中控服务器

    jsapi_ticket是使用js-sdk必须要的一个凭证,需要配置在js中. jsapi_ticket获取 要获取jsapi_ticket可以使用如下的方法 String jsapi_ticket ...

  2. .NET WinForm画树叶小程序

    看了一片文章(http://keleyi.com/a/bjac/nurox416.htm),是使用分型画树叶,代码是Java的,因为Java很久没弄了,改用C#实现,下载地址: 画树叶小程序下载 核心 ...

  3. RHEL7进程管理

    进程概念 名称 说明 程序 一组指令的集合 进程 程序的执行就是进程也可以把进程看成一个独立的程序在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己进程是资源分配的基本单位,也 ...

  4. SharePoint 2010 文档管理系列之星级评论功能

    前言:正如我们前面介绍的是,文档管理就是让大家更加直观.方便的对手里的文档,进行统筹掌控,哪些文档是有价值的,哪些文档更受大家欢迎,所有就带来了这个星级评论. 当然,这个是SharePoint 201 ...

  5. C语言泛型编程--抽象数据类型

    一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...

  6. 【读书笔记】iOS-读取文本文件

    一,文本文件的内容. 二,工程目录 三,ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional ...

  7. PL/SQL基础-异常处理

    --*********异常处理一.异常的类型 ORACLE异常分为两种类型:系统异常.自定义异常. 其中系统异常又分为:预定义异常和非预定义异常.1.预定义异常 ORACLE定义了他们的错误编号和异常 ...

  8. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

  9. 关于移动端click事件绑定的一个细节

    click是最常见的点击事件,但是对于移动终端,比如手机,一般都是以touch事件代替的,而click事件在手机也是生效的,只是会有1-2秒左右的延迟,那么当你想要用click而非touch事件的时候 ...

  10. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...