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即为循环的步数。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = ;
char ins[N][N];
int visit[N][N];
int steps[N][N];
int m, n, sc; void dfs(int r, int c, int stp)
{
int nr, nc;
switch(ins[r][c])
{
case 'N':
nr = r - ;
nc = c;
break;
case 'E':
nr = r;
nc = c + ;
break;
case 'S':
nr = r + ;
nc = c;
break;
case 'W':
nr = r;
nc = c - ;
break;
} if(nr>=&&nr<m && nc>=&&nc<n) //还在迷宫中
{
if(!visit[nr][nc]) //(nr, nc)未被访问
{
steps[nr][nc] = stp + ;
visit[nr][nc] = ;
dfs(nr, nc, stp+);
}
else //出现循环
{
printf("%d step(s) before a loop of %d step(s)\n", steps[nr][nc]-, stp-steps[nr][nc]+);
return;
}
}
else //走出迷宫
{
printf("%d step(s) to exit\n", stp);
return;
}
} int main()
{
//freopen("poj1573.txt", "r", stdin);
while(cin>>m>>n>>sc && m)
{
memset(visit, , sizeof(visit));
memset(steps, , sizeof(steps)); for(int i=; i<m; i++)
cin>>ins[i]; sc--;
visit[][sc] = ;
steps[][sc] = ;
dfs(, sc, );
}
return ;
}
poj1573 Robot Motion(DFS)的更多相关文章
- POJ 1573 Robot Motion(BFS)
Robot Motion Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12856 Accepted: 6240 Des ...
- POJ 1573 Robot Motion(模拟)
题目代号:POJ 1573 题目链接:http://poj.org/problem?id=1573 Language: Default Robot Motion Time Limit: 1000MS ...
- poj1573&&hdu1035 Robot Motion(模拟)
转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接: HDU:pid=1035">http://acm.hd ...
- HDU 1035 Robot Motion(dfs + 模拟)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 这道题比较简单,但自己一直被卡,原因就是在读入mp这张字符图的时候用了scanf被卡. ...
- hdu 1035 Robot Motion(模拟)
Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...
- HDOJ.1342 Lotto (DFS)
Lotto [从零开始DFS(0)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tempter of ...
- LeetCode Subsets II (DFS)
题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...
- LeetCode Subsets (DFS)
题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
随机推荐
- CSS文字溢出部分自动用"..."代替
CSS文字溢出部分自动用"..."代替 如html部分: <h4><马尔代夫双鱼岛Olhuveli4 晚6 日自助游></h4> <p&g ...
- sourceTree的下载与安装
一. SourceTree是什么? 一个拥有可视化界面的项目版本控制的软件,适用于git项目管理,在window和mac均可使用. 二. SourceTree下载 下载地址:SourceTree官网 ...
- 关于Linux运维的一些题目总结
一.有文件file1 1.查询file1里面空行的所在行号 awk ‘{if($0~/^$/)print NR}’ fileorgrep -n ^$ file |awk ‘BEGIN{FS=”:”}{ ...
- 笔记(二)TabLayout + ViewPager + FragmentPagerAdapter 组合用法
TabLayout的xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- .net core 中 identity server 4 之Server简单示例
Steps: 1.新建一个ASP.NET Core Web项目,SigmalHex.IdentityServer: 2.安装包 Install-Package IdentityServer4 3.St ...
- js获取上、下级html元素 js删除html元素方法
js获取下级html元素:htmlEle.childNode; js获取上级html元素:htmlEle.parentNode; js删除当前html元素: htmlEle.removeNode(tr ...
- 【BZOJ做题记录】07.07~?
在NOI一周前重开一个坑 最后更新时间:7.08 07:38 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后 ...
- python学习笔记(十五)之集合
集合:对应数学中的集合类型.集合中的元素是唯一,且无序的. 创建集合 方法一:使用{},注意python会自动删除重复元素 >>> number = {1,2,3,4,3,2,1} ...
- 从docker到docker-compose部署一个nginx+flask+mysql+redis应用
目的是把一个flask项目的mysql数据库.redis数据库.flask应用.nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭 一.安装docker Docke ...
- vps建站教程 CentOS6如何安装配置FTP服务器
通过之前的几篇文章,我们都知道了如何配置PHP环境,也知道如何保护我们的vps以及如何绑定多个域名建设多个网站.有时候我们为了让我们的朋友也能用我们的vps建站又不想给他们太多权限,有时候我们想要当个 ...