zoukankan      html  css  js  c++  java
  • poj1573 Robot Motion(DFS)

    题目链接

    http://poj.org/problem?id=1573

    题意

    一个机器人在给定的迷宫中行走,在迷宫中的特定位置只能按照特定的方向行走,有两种情况:①机器人按照方向序列走出迷宫,这时输出机器人走出迷宫的步数;②机器人在迷宫中陷入了循环,这种情况要输出机器人陷入循环前所走的步数以及循环的步数。

    思路

    走迷宫问题一般使用BFS或DFS求解,这里我使用DFS来求解。机器人能顺利走出迷宫的情况比较容易判断,主要是如何判断机器人陷入了循环以及陷入循环后的输出。我使用visit[r][c]来记录位置(r,c)是否被访问过,使用steps[r][c]记录机器人从起点到点(r,c)所经历的步数。假设(r,c)按照指令走了一步后的坐标为(nr,nc),若(nr,nc)已不在迷宫中,则输出结果;若(nr,nc)还在迷宫中,若该位置未被访问过,则按照指令走下一步,若(nr,nc)被访问过,则说明陷入了循环,位置(nr,nc)即是循环的起点,steps[nr][nc]-1即陷入循环前机器人所行走的步数,steps[r][c]-steps[nr][nc]+1即为循环的步数。

    代码

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 const int N = 11;
     7 char ins[N][N];
     8 int visit[N][N];
     9 int steps[N][N];
    10 int m, n, sc;
    11 
    12 void dfs(int r, int c, int stp)
    13 {
    14     int nr, nc;
    15     switch(ins[r][c])
    16     {
    17     case 'N':
    18         nr = r - 1;
    19         nc = c;
    20         break;
    21     case 'E':
    22         nr = r;
    23         nc = c + 1;
    24         break;
    25     case 'S':
    26         nr = r + 1;
    27         nc = c;
    28         break;
    29     case 'W':
    30         nr = r;
    31         nc = c - 1;
    32         break;
    33     }
    34 
    35     if(nr>=0&&nr<m && nc>=0&&nc<n)  //还在迷宫中
    36     {
    37         if(!visit[nr][nc])  //(nr, nc)未被访问
    38         {
    39             steps[nr][nc] = stp + 1;
    40             visit[nr][nc] = 1;
    41             dfs(nr, nc, stp+1);
    42         }
    43         else    //出现循环
    44         {
    45             printf("%d step(s) before a loop of %d step(s)
    ", steps[nr][nc]-1, stp-steps[nr][nc]+1);
    46             return;
    47         }
    48     }
    49     else    //走出迷宫
    50     {
    51         printf("%d step(s) to exit
    ", stp);
    52         return;
    53     }
    54 }
    55 
    56 int main()
    57 {
    58     //freopen("poj1573.txt", "r", stdin);
    59     while(cin>>m>>n>>sc && m)
    60     {
    61         memset(visit, 0, sizeof(visit));
    62         memset(steps, 0, sizeof(steps));
    63 
    64         for(int i=0; i<m; i++)
    65             cin>>ins[i];
    66 
    67         sc--;
    68         visit[0][sc] = 1;
    69         steps[0][sc] = 1;
    70         dfs(0, sc, 1);
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    多态性的理解
    类(三)——继承与多态
    类(二)——拷贝控制(浅拷贝,深拷贝,浅赋值,深赋值)
    类 (一) ——基本概念
    STL容器底层数据结构的实现
    异常处理
    C++实现单例模式
    类的成员函数的连续调用与返回值问题
    拷贝构造函数的参数为什么必须使用引用类型?拷贝赋值运算符的参数为什么也是引用类型?
    U盘装机教程
  • 原文地址:https://www.cnblogs.com/sench/p/7816528.html
Copyright © 2011-2022 走看看