(传送门)[https://www.luogu.org/problemnew/show/P1189]

先反省一波:我以后再也不用getchar()+scanf了(日常爆零)

算是比较裸的搜索吧,在下用的算是DFS(严格说来应该是枚举)+在线处理吧,就是一边输入方向一边处理,用ans数组表示输入这一次方向后汽车可能在的位置,每次输入方向后将不能继续前进的ans删去,将可以前进的ans更新到新的位置

void dfs(int x,int y,int dir,int l)
{
    if(map[x+fx[dir]][y+fy[dir]]) //如果不能继续前进,那么这个ans一定是错的,将它删去
    {
        ans[x][y]=0;
        return ;
    }
    for(int i=1;;i++) //知道我为什么说它是枚举了吧 qwq
    {
        int xx=x+fx[dir]*i,yy=y+fy[dir]*i;
        if(xx<1||xx>n||yy<1||yy>m||map[xx][yy]) //不断前进,并将这条路全置为ans(因为都符合条件)
          break;
        ans[xx][yy]=l+1; //防止重复查找,即防止刚置为ans后没有进行下一重循环,直接在这层循环再搜一次
    }
    return ;
}

上面的dfs函数可以去掉不能继续前进的答案,加入新的答案,那么旧的答案该怎么办呢? 我们可以在循环到ans后直接将它删去,因为对我们来说它已经没用了。接下来直接上代码

#include<iostream>
#include<cstdio>
using namespace std;
bool map[51][51]; //判断有没有障碍物
int ans[51][51];  //存答案
char mmp[51][51]; //存地图,不要在意变量名
int n,m,k;
int fx[5]={0,0,0,1,-1}; //存方向,顺序是E、W、S、N
int fy[5]={0,1,-1,0,0};
void dfs(int x,int y,int dir,int l)
{
    if(map[x+fx[dir]][y+fy[dir]]) //如果不能继续前进,那么这个ans一定是错的,将它删去
    {
        ans[x][y]=0;
        return ;
    }
    for(int i=1;;i++) //知道我为什么说它是枚举了吧 qwq
    {
        int xx=x+fx[dir]*i,yy=y+fy[dir]*i;
        if(xx<1||xx>n||yy<1||yy>m||map[xx][yy]) //不断前进,并将这条路全置为ans(因为都符合条件)
          break;
        ans[xx][yy]=l+1; //防止重复查找,即刚置为ans后没有进行下一重循环,直接在这层循环再搜一次
    }
    return ;
}
int main()
{
    输入+预处理地图
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mmp[i][j];
            if(mmp[i][j]=='X')  map[i][j]=1;
            if(mmp[i][j]=='*')  ans[i][j]=1;
        }
    }
    //在线查找
    scanf("%d",&k);
    for(int o=1;o<=k;o++)
    {
        char a[10]; scanf("%s",a);
        if(a[0]=='E')
        {
            for(int i=1;i<=n;i++)
              for(int j=1;j<=m;j++)
              {
                if(ans[i][j]==o)
                {
                    ans[i][j]=0; //将旧的答案删去,下同
                    dfs(i,j,1,o); //用当层的答案去寻找新的答案
                }
              }
        }
        if(a[0]=='W')
        {
            for(int i=1;i<=n;i++)
              for(int j=1;j<=m;j++)
              {
                if(ans[i][j]==o)
                {
                    ans[i][j]=0;
                    dfs(i,j,2,o);
                }
              }
        }
        if(a[0]=='S')
        {
            for(int i=1;i<=n;i++)
              for(int j=1;j<=m;j++)
              {
                if(ans[i][j]==o)
                {
                    ans[i][j]=0;
                    dfs(i,j,3,o);
                }
              }
        }
        if(a[0]=='N')
        {
            for(int i=1;i<=n;i++)
              for(int j=1;j<=m;j++)
              {
                if(ans[i][j]==o)
                {
                    ans[i][j]=0;
                    dfs(i,j,4,o);
                }
              }
        }
    }
    //输出
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(!ans[i][j]&&mmp[i][j]=='*'){cout<<'.'; continue;}
            if(!ans[i][j])
              cout<<mmp[i][j];
            else
              cout<<'*';
        }
        cout<<endl;
    }  

    return 0;
}

题解 P1189 SEARCH的更多相关文章

  1. P1189 SEARCH(逃跑的拉尔夫)

    P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...

  2. 洛谷P1189 SEARCH 题解 迭代加深

    题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...

  3. LeetCode题解33.Search in Rotated Sorted Array

    33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...

  4. leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)

    题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would t ...

  5. leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...

  6. LintCode题解之Search Range in Binary Search Tree

    1.题目描述 2.问题分析 首先将二叉查找树使用中序遍历的方式将元素放入一个vector,然后在vector 中截取符合条件的数字. 3.代码 /** * Definition of TreeNode ...

  7. leetcode个人题解——#33 Search in Rotated Sorted Array

    思路:每次取中间元素,一定有一半有序,另一半部分有序,有序的部分进行二分查找,部分有序的部分递归继续处理. class Solution { public: ; int middleSearch(in ...

  8. 洛谷P1189'SEARCH'

    题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程 ...

  9. leetcode 题解 word search。递归可以更简洁。

    先写上我的代码: 我总是不知道何时把任务交给下一个递归.以致于,写出的代码很臃肿! 放上别人递归的简洁代码: bool exist(char** board, int m, int n, char* ...

随机推荐

  1. jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)

    这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...

  2. 001-JDK安装

    1.确定JDK的具体版本号 [root@bogon ~]# rpm -qa | grep jdk java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64 java ...

  3. 洛谷 P1908 逆序对(树状数组解法)

    归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...

  4. bootstrapValidator 常用的验证

    $("#表单ID").bootstrapValidator({ message: 'This value is not valid', excluded: [':disabled' ...

  5. 最短路之SPFA(单源)HDU 2066

    #include "iostream" #include "cstdio" #include "queue" #include <cs ...

  6. netty与MQ使用心得

    最近在做分布式的系统,使用netty与mq进行远程RPC调用,现将心得经验总结一下. 我们公司的服务器在云端机房,在每一个店面有一个服务器,店面服务器外网无法访问. 我们的做法是店面服务器在启动时与云 ...

  7. 1-26HashSet简介

    Set的特点 Set里面存储的元素不能重复,没有索引,存取顺序不一致. package com.monkey1024.set; import java.util.HashSet; /** * Set的 ...

  8. MODBUS移植的参考文章

    https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 http://www.360doc.com/content/14/0906/09 ...

  9. Unix高级编程之文件权限

    1.访问权限表 st_mode 意义 S_IRUSR 用户-读 S_IWUSR 用户-写 S_IXUSR 用户-执行 S_IRGRP 组-读 S_IWGRP 组-写 S_IXGRP 组-执行 S_IR ...

  10. hasNextInt()方法

    hasNextInt()方法是判断控制台接收是否为数字,当你在控制台输入一个字符的时候,hasNextInt()判断你输入这个字符是不是数字,而不是接收值,当if判断通过之后执行接收,也就是你输入的那 ...