WIKIOI 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..

*/

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    const int MAX_N = 51;
    const int MAX_M = 1001;
    int R, C, N;
    int x, y;
    int turn[MAX_M];             //移动方向 ,turn[t] 表示 第t个方向
    int M[MAX_N][MAX_N];         //以0,1存储原地图,方便判断
    char A[MAX_N][MAX_N];        //以字符存储行驶后的地图,方便输出
    int vis[MAX_N][MAX_N][MAX_M];    //vis[x][y][t] 表示 从点(x,y)往第t个方向(turn[t])移动
    void DFS(int x, int y, int t)
    {
        if (vis[x][y][t]) return;     //如果该移动状态出现过了,则不考虑
        vis[x][y][t] = 1;             //没出现过,则考虑,标记。。
        if (t > N)      //如果遍历完所有行驶方向,则得到一个目标可能点。
        {
            A[x][y] = ‘*‘;
            return;
        }
        if (turn[t] == 1)            //北(上)
        {
            x--;                    //向上移动一步
            while (x >= 1 && M[x][y])  //约束条件,一直行驶直到无法继续
            {
                DFS(x, y, t + 1);   //从当前点开始搜索,按照turn的顺序行驶,每个方向都要走到边界
                x--;
            }
        }
        if (turn[t] == 2)            //南(下)
        {
            x++;
            while (x <= R && M[x][y])
            {
                DFS(x, y, t+1);
                x++;
            }
        }
        if (turn[t] == 3)                //西(左)
        {
            y--;
            while (y >= 1 && M[x][y])
            {
                DFS(x, y, t + 1);
                y--;
            }
        }
        if (turn[t] == 4)              //东(右)
        {
            y++;
            while (y <= C && M[x][y])
            {
                DFS(x, y, t + 1);
                y++;
            }
        }
    }
    int main()
    {
        int i, j;
        cin>>R>>C;
        for (i = 1; i <= R; i++)
        {
            for (j = 1; j <= C; j++)
            {
                cin>>A[i][j];
                if (A[i][j] == ‘.‘) M[i][j] = 1;
                if (A[i][j] == ‘X‘) M[i][j] = 0;
                if (A[i][j] == ‘*‘)
                {
                    A[i][j] = ‘.‘;
                    M[i][j] = 1;
                    x = i;
                    y = j;
                }
            }
        }
        cin>>N;
        for (i = 1; i <= N; i++)
        {
            char dir[5];
            cin>>dir;
            if (dir[0] == ‘N‘) turn[i] = 1;
            if (dir[0] == ‘S‘) turn[i] = 2;
            if (dir[0] == ‘W‘) turn[i] = 3;
            if (dir[0] == ‘E‘) turn[i] = 4;
        }
        DFS(x, y, 1);
        for (i = 1; i <= R; i++)
        {
            for (j = 1; j <= C; j++)
                printf("%c", A[i][j]);
            if(i != R)
                printf("\n");
        }
        return 0;
    }  
时间: 2024-08-02 11:03:09

WIKIOI 1026 逃跑的拉尔夫 深度优先搜索的相关文章

codevs 1026 逃跑的拉尔夫 x

1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程序,通过使用一张小镇的地图帮助警察局找到那辆车.程序必须能表示出该车最终所有可能的位置. 小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行.“.”表示小镇上那块

1026 逃跑的拉尔夫

1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程序,通过使用一张小镇的地图帮助警察局找到那辆车.程序必须能表示出该车最终所有可能的位置. 小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行.“.”表示小镇上那块

宽度优先搜索 之 CODE[VS] 1026 逃跑的拉尔夫

/* 读懂题意,bfs即可AC. 不过注意“超出空间 Memory Limit Exceeded”,需要记录节点的状态,判重. bool isUsed[MaxN][MaxN][1010]; // 用于判重 */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstddef> 5 #include <iterator> 6 #include &l

codevs 1026:逃跑的拉尔夫

题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程序,通过使用一张小镇的地图帮助警察局找到那辆车.程序必须能表示出该车最终所有可能的位置. 小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行."."表示小镇上那块地方是可以行车的,而符号"X"表示此处不能行车.拉尔夫所开小车的初始位置用字

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

1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程序,通过使用一张小镇的地图帮助警察局找到那辆车.程序必须能表示出该车最终所有可能的位置. 小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行.“.”表示小镇

深度优先搜索与广度优先搜索算法理解

深度优先搜索算法和广度优先搜索算法是图论中两个有意思也很实用的算法,下面我们来看看这两个算法. 严书中,给出的利用深度优先搜索(Deep First Search)算法进行图的遍历伪码如下 1 Boolean visited[MAX]; //标志数组 2 Status (*VisitFunction)(int v); //访问函数 3 4 void DFSTraverse(Graph G, Status (*Visit)(int v)) 5 { 6 VisitFunction = Visit;

图论 深度优先搜索 广度优先搜索的非递归实现

深度优先遍历 1.深度优先遍历的递归定义 假设给定图G的初态是所有顶点均未曾访问过.在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过:然后依次从v出发搜索v的每个邻接点w.若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止.若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止. 图的深度优先遍历类似于树的

深度优先搜索

在图中的深度优先搜索,由于避免回路的产生,设置visit数组. 有两种深度优先的应用场景.一种是用于最优解的寻找,即到达目的地的最优解.这时需要设置全局的一个数组,还有变量,来储存路径.通过与别的方法的比较,获取最优解. 第二种是染色问题,只要求全部遍历,没有最优的要求. 还有哈希的用法.当需要记录拥有共同数字特征的一些属性时,就可以使用哈希数组.使用时按照属性的含义寻找.如二叉树某层的数量.

深度优先搜索(dfs)

关于深度优先搜索的总结: 1 dfs 的基本结构:  void dfs(int x){ if( x 超出边界){ return ; }else{ for(遍历){ if(未访问过){ 访问         ; 打上标记    ; dfs(x + 1) ; 去掉标记    ; //极易忘记 } } } return; } 2 用dfs求全排列: 本来好好的,结果sizeof(pointer) 就完蛋了.神秘的内存错误,而且还能正常的跑出一个不正常的结果出来. 想了解sizeof这个小妖精的看这里