HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)]

点我挑战题目

从零开始DFS

HDOJ.1342 Lotto [从零开始DFS(0)] — DFS思想与框架/双重DFS

HDOJ.1010 Tempter of the Bone [从零开始DFS(1)] —DFS四向搜索/奇偶剪枝

HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] —DFS四向搜索变种

HDOJ(HDU).1016 Prime Ring Problem (DFS) [从零开始DFS(3)] —小结:做DFS题目的关注点

HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)]—DFS题目练习

HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] —DFS八向搜索/双重for循环遍历

HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] —DFS双重搜索/去重技巧

HDOJ(HDU).1045 Fire Net [从零开始DFS(7)]—DFS练习/check函数的思想

题意分析

给出地图规模n * m, 给出入口坐标(0,y),遵循以下规则,求解机器人能否走出地图。若能,输出走出地图所需要的步数,若不能,输出进入循环前走的步数和循环的步数。

规则:

若当前格子为N,则只能向上走,若为S向下走,E向右走,W向左走。

我第一感觉是模拟题,因为对于每个格子状态是唯一的,只有1组解:要么能走出去,要么不能。分别求出步数就行了,但感觉dfs能做,决定还是按照dfs的方法试一试。

分析一波:

递归边界就是机器人走出了地图或者是机器人走回到了走过的地方(吃回头草了),即可判定输出了。那么需要记录的东西就是当前走的步数,和循环的步数。当前走的步数好说,递归传参+1就行了,循环的步数想想也不难:当下一步就要吃回头草的时候,两个状态的步数之差就是循环的步数。与先前的双重搜索,四向搜索不同,dfs中要判断这个格子的字符是什么,然后决定如何走下一步。

上代码。

代码总览

/*
Title:HDOJ.1035
Author:pengwill
Date:2017-2-6
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,y,loop,step,beloop;
char mp[11][11];
int visit[11][11];
bool judge = false;
bool check(int x, int y)
{
if(x<0||x>=n||y<0||y>=m){ judge = true ;return false;}
else return true;
}
void dfs(int x, int y, int s)
{
if(!check(x,y)) return;
step = s;
if(!judge){
if(!visit[x][y]){
visit[x][y] = s;
if(mp[x][y] == 'N') dfs(x-1,y,s+1);
else if(mp[x][y] == 'S') dfs(x+1,y,s+1);
else if(mp[x][y] == 'E') dfs(x,y+1,s+1);
else if(mp[x][y] == 'W') dfs(x,y-1,s+1);
}else{
beloop = visit[x][y]-1;
loop = s - visit[x][y] ;
}
}
}
int main()
{
// 难点如何记步
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)&&n){
scanf("%d",&y);y--;
for(int i = 0;i<n;++i)
scanf("%s",mp[i]);
judge = false;
memset(visit,0,sizeof(visit));
dfs(0,y,1);
if(judge) printf("%d step(s) to exit\n",step);
else printf("%d step(s) before a loop of %d step(s)\n",beloop,loop); }
return 0;
}

首先有3个全局变量保存着结果,分别是step,loop,beloop,分别保存着走出地图用的步数,循环的步数,在循环之前的步数。

main函数完成初始化,check函数检查是否走出地图,若走出地图则judge置为true并且终止递归。每一步把当前的步数保存在visit[x][y]中,并且根据visit[x][y]是否为0判断是否吃了“回头草”。最后别忘了及时更新loop和beloop。

应该来说是一道简单的dfs应用题。

从零开始DFS:

HDOJ.1342 Lotto [从零开始DFS(0)]

HDOJ.1010 Tempter of the Bone [从零开始DFS(1)]

HDOJ(HDU).1015 Safecracker [从零开始DFS(2)]

HDOJ(HDU).1015 Safecracker [从零开始DFS(3)]

HDOJ(HDU).1035 Robot Motion (DFS)的更多相关文章

  1. hdu 1035 Robot Motion(dfs)

    虽然做出来了,还是很失望的!!! 加油!!!还是慢慢来吧!!! >>>>>>>>>>>>>>>>> ...

  2. (step 4.3.5)hdu 1035(Robot Motion——DFS)

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

  3. [ACM] hdu 1035 Robot Motion (模拟或DFS)

    Robot Motion Problem Description A robot has been programmed to follow the instructions in its path. ...

  4. HDU 1035 Robot Motion(dfs + 模拟)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 这道题比较简单,但自己一直被卡,原因就是在读入mp这张字符图的时候用了scanf被卡. ...

  5. 题解报告:hdu 1035 Robot Motion(简单搜索一遍)

    Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...

  6. hdu 1035 Robot Motion(模拟)

    Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...

  7. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  8. HDOJ(HDU).1241 Oil Deposits(DFS)

    HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...

  9. HDOJ(HDU).2660 Accepted Necklace (DFS)

    HDOJ(HDU).2660 Accepted Necklace (DFS) 点我挑战题目 题意分析 给出一些石头,这些石头都有自身的价值和重量.现在要求从这些石头中选K个石头,求出重量不超过W的这些 ...

随机推荐

  1. 负数取余/整除,Python和C语言的不同

    总结一句:Python中负数整除,是向负无穷取整,所以导致负数取余不对 在数学公式中,两种语言的表示算法都是一样的,都是: r=a-n*[a/n] 以上,r是余数,a是被除数,n是除数. 唯一不同点, ...

  2. Struts2(八.添加用户多张照片实现文件上传功能)

    1.modify.jsp 在modify.jsp修改用户信息页面实现文件上传,添加用户照片的功能 如果是文件上传,method必须是post,必须指定enctype <form method=& ...

  3. 关于java中的“error: bad operand types for binary operator ”

    今天做这个题目的时候(142. O(1) Check Power of 2),遇到一个错误“ bad operand types for binary operator '&' ”. 先贴一下 ...

  4. 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现

    引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...

  5. leetcode个人题解——#11 Container with most water

    class Solution { public: int maxArea(vector<int>& height) { ; ; ; while(l < r) { int h ...

  6. HTMLTestRunner解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128)

    其中HTML和数据库都是设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是python的str默认是ascii编码,和unicode编码冲突,就会报这个标题错误. ...

  7. codeforces 269C Flawed Flow(网络流)

    Emuskald considers himself a master of flow algorithms. Now he has completed his most ingenious prog ...

  8. 手机站测试工具(node服务器)

    最近在工作中遇到手机站测试的问题,于是就写了一个node服务外加一个第三方的转二维码功能,欢迎拍砖~ 项目地址:https://github.com/finderL/webserver

  9. bootstrapValidator.js,最好用的bootstrap表单验证插件 简单实用方法

    实用方法 1.引入 在有jquery和bootstrap的页面里引入bootstrapValidator.js和bootstrapValidator.css文件 2. 按照bootstrap的表单组件 ...

  10. lintcode-178-图是否是树

    178-图是否是树 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 注意事项 你可以假设我们不会 ...