(传送门)[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. MFC CMap整理

    映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”.CMap是把唯一关键码映射到值的字典收集类,使用CMap可以构造一个关键字和元素值映射的集合类.一旦在映射中插入了一个关键码值对(元 ...

  2. Python decorate 函数

    1. decorate 函数需要在 "@wrap" 之前定义, 否则会报错

  3. [Xcode 实际操作]一、博主领进门-(13)在控制台的几种打印输出语句和po命令

    目录:[Swift]Xcode实际操作 本文将演几种在控制台输出日志的方式. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class ...

  4. [Xcode 实际操作]八、网络与多线程-(4)使用UIApplication对象发送短信

    目录:[Swift]Xcode实际操作 本文将演示如何使用应用程序单例对象,发送短信的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 注:需要使用真机进行测 ...

  5. IT兄弟连 JavaWeb教程 JSP内置对象2

    application对象 application对象用于保存所有应用程序中的公有数据.它在服务器启动时自动创建,在服务器关闭时销毁,当application对象没有被销毁时,所有用户都可以共享app ...

  6. JS与JQ的对比与提高

    来吧, 案例1:先上个例子js写的省市二级联动 <!DOCTYPE html><html> <head> <meta charset="UTF-8& ...

  7. assembly x86(nasm)的日常

    cs的日常打卡. data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;43,35 sun1 db 'SUN' swc ...

  8. Hadoop概念学习系列之Hadoop 生态系统

    当下 Hadoop 已经成长为一个庞大的生态体系,只要和海量数据相关的领域,都有 Hadoop 的身影.下图是一个 Hadoop 生态系统的图谱,详细列举了在 Hadoop 这个生态系统中出现的各种数 ...

  9. Tomcat日志文件的输出在Linux和Windows下的差异

    前言 最近老大发现Tomcat的日志文件catalina.out里存在着大量的和公司项目相关的log信息,因为一般都是会使用日志框架并另外将log信息输出到另外的文件里的,catalina.out文件 ...

  10. PostgreSQL-11-WITH语句

    1.WITH语句原理:通用表表达式(Common Table Expressions)/CTEs,在大型查询中的辅助语句 WITH name_for_summary_data AS ( SELECT ...