zoukankan      html  css  js  c++  java
  • (step 4.3.5)hdu 1035(Robot Motion——DFS)

    题目大意:输入三个整数n,m,k,分别表示在接下来有一个n行m列的地图。一个机器人从第一行的第k列进入。问机器人经过多少步才能出来。如果出现了循环

    则输出循环的步数


    解题思路:DFS


    代码如下(有详细的解释):

    /*
     * 1035_1.cpp
     *
     *  Created on: 2013年8月17日
     *      Author: Administrator
     */
    /*简单搜索题,看注释:
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    /**
     * map[][] :用来标记地图
     * num[x][y] : 用来标记走到(x,y)这个点的时候用了多少步.
     * 如果num[x][y] == 0,则证明这一步还没走过。否则,根据题意则可能出现了循环
     *
     * n: 行数
     * m: 列数
     * k: 从第一行的第k列进入地图
     * t: 总共走了多少步
     * lop: 循环的步数
     */
    char map[11][11];
    int num[11][11];
    int n, m, k, lop, t;
    
    /**
     * 判断是否越界
     */
    bool Overmap(int x, int y) {
        if (x < 1 || x > n || y < 1 || y > m) {
            return true;
        } else {
            return false;
        }
    }
    
    void Dfs(int x, int y) {
    	//如果越界了或者是出现了循环
        if (Overmap(x, y) || lop > 0) {
               if (lop > 0) {
                printf("%d step(s) before a loop of %d step(s)
    ", t - lop, lop);
            } else {
                printf("%d step(s) to exit
    ", t);
            }
            return ;
        }
    
    
        if (num[x][y] == 0) {//如果这一步还没有走过
            num[x][y] = ++t;
        } else {//判断是否有循环(如果这一步已经走过,则计算循环的步数)
            lop = t - num[x][y] + 1;
        }//else
    
        //遍历状态
        switch(map[x][y]) {
            case 'N': x--; Dfs(x, y); x++; break; //Dfs最主要:前加的条件,在之后要返回
            case 'E': y++; Dfs(x, y); y--; break;
            case 'S': x++; Dfs(x, y); x--; break;
            case 'W': y--; Dfs(x, y); y++; break;
        }//switch
    }//dfs
    
    
    int main() {
    	while (scanf("%d %d %d", &n, &m, &k) != EOF, n) {
            memset(map, 0, sizeof(map));
            memset(num, 0, sizeof(num));
    
            lop = 0;
            t = 0;
            getchar();
            for (int i = 1; i <= n; i++) {
                scanf("%s", map[i] + 1);
                getchar();
            }
            Dfs(1, k);
    
        }
    }
    
    
    





  • 相关阅读:
    虚拟主机支持apk
    pc显示,手机隐藏
    manjaro个人配置
    docker-compose部署elk
    docker-compose部署zk和kafka
    docker-compose部署redis-cluster
    ActiveMQ与RocketMQ对比
    dropbox离线安装包--需FQ
    C++实现中缀表达式转前、后缀
    运算符优先级
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3265426.html
Copyright © 2011-2022 走看看