(传送门)[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. Lightoj1122 【数位DP】

    题意: 给你m个数,让你在里面挑n个组合,保证位数相差不超过2,求能够组合多少种情况: 思路: dp[i][j]代表第i个结尾为j的方案数. #include<bits/stdc++.h> ...

  2. 用css写三角形,宽高可设置

    1.不传@h,@c === @h; 2.元素width = @w, 元素height = @h*2 3.配合上.center()实现图标居中 less版本: //上下左右居中 .center(){ p ...

  3. 2014-5-24 NOIP模拟赛

    Problem 1 护花(flower.cpp/c/pas) [题目描述] 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时 ...

  4. CF939D Love Rescue

    题意 给定两个长度为n的由小写字母组成的字符串 每次可以花费1的代价,指定两个字母,把其中一个全部变为另一个 求使两个字符串相同的最小花费 n <= 100000 因为谁变成谁没有关系反正相等就 ...

  5. VRTK3.3.0-001头盔相机

    VRTK3.3.0下载地址:https://github.com/ExtendRealityLtd/VRTK/tree/3.3.0 SteamVR1.2.3下载地址:https://github.co ...

  6. 受保护的封装 protected

    补充内容:封装 私有化封装 private受保护的封装 protected公共的封装 public 注意:python目前不支持设定受保护的成员,但是开发者由约定的使用方式 受保护的封装:在成员名称前 ...

  7. Restful API官方文档

    理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful RESTful设计指南:http://www.ruanyifeng.com/blo ...

  8. 2017国家集训队作业Atcoder题目试做

    2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...

  9. UG 常用设置

    Q01:UG制图,添加基本视图之后的中心线怎么去掉? A01:“菜单-->文件-->首选项-->制图-->视图-->公共-->常规-->□带中心线创建”,取消 ...

  10. volatile关键字简单摘要

    volatile就可以说是java虚拟机提供的最轻量级的同步机制 特性: 1.保证共享变量的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的——要了解主存.高速缓存还有Java内 ...