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

Posted Only U - IU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 100

using 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 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[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 (搜索)的主要内容,如果未能解决你的问题,请参考以下文章

codevs1026 逃跑的拉尔夫

codevs 1026 逃跑的拉尔夫

codevs 1026:逃跑的拉尔夫

1026 逃跑的拉尔夫

AC日记——苹果树 codevs 1228

逃跑的拉尔夫