首页 > 代码库 > AC日记——逃跑的拉尔夫 codevs 1026 (搜索)

AC日记——逃跑的拉尔夫 codevs 1026 (搜索)

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 100using namespace std;int read()    {      int x=0;      char ch=getchar();      while (ch<0||ch>9) ch=getchar();      while (ch>=0&&ch<=9) x=x*10+ch-0,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[10000];int xx[]={1,-1,0,0};int yy[]={0,0,1,-1};int turn(char x)    {      if (x==*) return INF;      if (x==.) return 1;       return 0;     }int Turn(char x)    {      if (x==N) return 1;      if (x==S) return 0;      if (x==E) return 2;      if (x==W) return 3;    }char turn(int x)    {      if (x==INF) return *;      if (x==1) return .;      return X;        }int check(int x,int y)    {      if (x>0&&x<n+1&&y>0&&y<m+1) return 1;      return 0;        }int bfs()    {        vis[1][Sx][Sy]=1;        que.push(ss(Sx,Sy,1));        for (int i=1;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+1][now.x][now.y]) que.push(ss(now.x,now.y,i+1)),vis[i+1][now.x][now.y]=1;                        }                 }            }    }int main()   {        n=read(),m=read();        for (int i=1;i<=n;i++)           {              scanf("%s",ch);           for (int j=1;j<=m;j++)              {                map[i][j]=turn(ch[j-1]);                if (map[i][j]==INF) {Sx=i;Sy=j;map[i][j]=1;}              }           }        q=read();     for (int i=1;i<=q;i++)        {          scanf("%s",ch);          fx[i]=Turn(ch[0]);            }     bfs();                while (!que.empty())           {              ss now=que.front();que.pop();              map[now.x][now.y]=INF;               }     for (int i=1;i<=n;i++)         {             for (int j=1;j<=m;j++) cout<<turn(map[i][j]);             cout<<endl;         }        return 0;   }   

(其实很恶心的说)

 

我的:

#include<queue>#include<cstdio>#include<iostream>#define INF 0x7fffffffusing 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[5]={0,-1,0,1,0};const int dy[5]={0,0,1,0,-1};int n,m,map[100][100],sx,sy,q,orientation[1001];char cur[100];bool flag[60][60][1100];queue<struct node>que;int turn_charinint(char x){    if(x==X) return 0;    if(x==.) return 1;    if(x==N) return 1;    if(x==S) return 3;    if(x==W) return 4;    if(x==E) return 2;    return INF;}char turn_intinchar(int x){    if(x==INF) return *;    if(x==0) return X;    else return .;}bool ok(){    if(now.x+dx[orientation[now.step]]<=n&&now.x+dx[orientation[now.step]]>0)    if(now.y+dy[orientation[now.step]]<=m&&now.y+dy[orientation[now.step]]>0)    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,1));    flag[sx][sy][1]=true;    for(int i=1;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+1]) continue;                que.push(node(now.x,now.y,now.step+1));                flag[now.x][now.y][now.step+1]=true;            }        }    }}int main(){    //scanf("%d%d",&n,&m);    cin>>n>>m;    for(int i=1;i<=n;i++)    {        //scanf("%s",cur);        cin>>cur;        for(int j=1;j<=m;j++)        {            map[i][j]=turn_charinint(cur[j-1]);            if(map[i][j]==INF)            {                sx=i,sy=j;                map[i][j]=1;            }        }    }    //scanf("%d",&q);    cin>>q;    for(int i=1;i<=q;i++)    {        cin>>cur;        orientation[i]=turn_charinint(cur[0]);    }    bfs();    while(!que.empty())    {        now=que.front();        que.pop();        map[now.x][now.y]=INF;    }    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            putchar(turn_intinchar(map[i][j]));        }        putchar(\n);    }    return 0;}

 

 

AC日记——逃跑的拉尔夫 codevs 1026 (搜索)