poj3083走玉米地问题
走玉米地迷宫,一般有两种简单策略,遇到岔路总是优先沿着自己的左手方向,或者右手方向走。给一个迷宫,给出这两种策略的步数,再给出最短路径的长度。
#########
#.#.#.#.#
S.......E
#.#.#.#.#
######### 迷宫示例
前两种策略用DFS的方法,最后一种用BFS的方法分别确定路线。易错点:
1.这道题目因为在走的时候遇到死路需要回头,且这个步数也要计算在内,所以不需要将走过的路设置标志。
2.总是沿着当前的左边或者右边走,即方向需要不断调整
贴代码如下:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
typedef class
{
public:
int x,y;
int path;
}vertex; char maze[][];
int trace[][];
int lpath,rpath,spath;
queue<vertex> bfq; int incre[][]={ //first LEFT, then MID, last RIGHT
{-,,,,,,,-},
{,,,,,-,-,},
{,,,-,-,,,},
{,-,-,,,,,}
}; int LDFS(int x,int y,int ind)
{
int nind;
trace[x][y]=;
if(maze[x][y]=='E')
{
cout<<lpath<<" ";
return -;
}
//左转
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
lpath++;
nind=(ind+)%;
if(LDFS(x+incre[ind][],y+incre[ind][],nind)==-) return -;
}
//直行
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
lpath++;
if(LDFS(x+incre[ind][],y+incre[ind][],ind)==-) return -;
}
//右转
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
lpath++;
nind=(ind+)%;
if(LDFS(x+incre[ind][],y+incre[ind][],nind)==-) return -;
}
//后转
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
lpath++;
nind=(ind+)%;
if(LDFS(x+incre[ind][],y+incre[ind][],nind)==-) return -;
} return lpath;
} int RDFS(int x,int y,int ind)
{
int nind;
trace[x][y]=;
if(maze[x][y]=='E')
{
cout<<rpath<<" ";
return -;
}
//右转
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
rpath++;
nind=(ind+)%;
if(RDFS(x+incre[ind][],y+incre[ind][],nind)==-) return -;
}
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
rpath++; if(RDFS(x+incre[ind][],y+incre[ind][],ind)==-) return -;
}
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
rpath++;
nind=(ind+)%;
if(RDFS(x+incre[ind][],y+incre[ind][],nind)==-) return -;
}
if(maze[x+incre[ind][]][y+incre[ind][]]!='#'&&trace[x+incre[ind][]][y+incre[ind][]]==)
{
rpath++;
nind=(ind+)%;
if(RDFS(x+incre[ind][],y+incre[ind][],nind)==-) return -;
}
return rpath;
} void BFS(vertex v,int ind)
{
vertex a,b;
bfq.push(v);
trace[v.x][v.y]=;
while(bfq.size()!=)
{
a=bfq.front();
bfq.pop();
if(maze[a.x+incre[ind][]][a.y+incre[ind][]]!='#'&&trace[a.x+incre[ind][]][a.y+incre[ind][]]==)
{
trace[a.x+incre[ind][]][a.y+incre[ind][]]=;
b.x=a.x+incre[ind][]; b.y=a.y+incre[ind][]; b.path=a.path+;
if(maze[b.x][b.y]=='E')
{
cout<<b.path<<endl;
break;
}
bfq.push(b);
}
if(maze[a.x+incre[ind][]][a.y+incre[ind][]]!='#'&&trace[a.x+incre[ind][]][a.y+incre[ind][]]==)
{
trace[a.x+incre[ind][]][a.y+incre[ind][]]=;
b.x=a.x+incre[ind][]; b.y=a.y+incre[ind][]; b.path=a.path+;
if(maze[b.x][b.y]=='E')
{
cout<<b.path<<endl;
break;
}
bfq.push(b);
}
if(maze[a.x+incre[ind][]][a.y+incre[ind][]]!='#'&&trace[a.x+incre[ind][]][a.y+incre[ind][]]==)
{
trace[a.x+incre[ind][]][a.y+incre[ind][]]=;
b.x=a.x+incre[ind][]; b.y=a.y+incre[ind][]; b.path=a.path+;
if(maze[b.x][b.y]=='E')
{
cout<<b.path<<endl;
break;
}
bfq.push(b);
}
if(maze[a.x+incre[ind][]][a.y+incre[ind][]]!='#'&&trace[a.x+incre[ind][]][a.y+incre[ind][]]==)
{
trace[a.x+incre[ind][]][a.y+incre[ind][]]=;
b.x=a.x+incre[ind][]; b.y=a.y+incre[ind][]; b.path=a.path+;
if(maze[b.x][b.y]=='E')
{
cout<<b.path<<endl;
break;
}
bfq.push(b);
}
}
} int main()
{
int instan,w,h,i,j,sx,sy,ind;
char in;
cin>>instan;
for(int Num=;Num<instan;Num++)
{
cin>>w>>h;
for(i=;i<h;i++)
for(j=;j<w;j++)
{
cin>>in;
maze[i][j]=in;
if(maze[i][j]=='S')
{
sx=i;sy=j;
}
}
if(sy==) ind=;
if(sx==) ind=;
if(sy==(w-)) ind=;
if(sx==(h-)) ind=;
lpath=;
memset(trace,,sizeof(trace));
lpath=LDFS(sx,sy,ind);
rpath=,spath=;
memset(trace,,sizeof(trace));
rpath=RDFS(sx,sy,ind);
//cout<<lpath<<" "<<rpath<<endl;
vertex vs;
vs.x=sx;vs.y=sy;vs.path=;
memset(trace,,sizeof(trace));
BFS(vs,ind);
while(bfq.empty()!=)
{
bfq.pop();
}
}
return ;
}
poj3083走玉米地问题的更多相关文章
- ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)
//POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...
- SQLSERVER走起微信公众帐号已经开通搜狗微信搜索
SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...
- SQLSERVER走起 APP隆重推出
SQLSERVER走起 APP隆重推出 为方便大家查看本微信公众以前推送的文章,QQ群里面的某位SQLSERVER重度爱好者开发了<SQLSERVER走起>的APP 以供大家一起交流 网页 ...
- SQLSERVER走起微信公众帐号全新改版 全新首页
SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- 游走 bzoj 3143
游走(2s 128MB)walk [问题描述] [输入格式] [输出格式] [样例输入] 3 3 2 3 1 2 1 3 [样例输出] 3.333 [样例说明] 题解: 主要算法:贪心:高斯消元: 题 ...
- 1226关于count(*)不走主键索引反而走二级索引
转自 http://www.2cto.com/database/201508/433975.html mysqlcount(*)会选哪个索引? 2015-08-19 0个评论 来源:D ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- 【bzoj3143】 Hnoi2013—游走
http://www.lydsy.com/JudgeOnline/problem.php?id=3143 (题目链接) 题意 一个无向连通图,顶点从1编号到N,边从1编号到M.每一步以相等的概率随机选 ...
随机推荐
- 阅读小记3(《C编程专家》)
gets()不检查缓冲区空间.多余的字符将覆盖原来的栈的内容. fgets()的第二个參数说明最大读入的字符数. 假设这个參数值为n,那么fgets()就会读取最多n-1个字符或读完一个换行符为止.两 ...
- Hard Parse&Soft Parse
DDL每次运行将必须是难以解决. SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过程: 1.语法检查(syntax check): 检查此sql的拼写是否语法. 2.语义检查(seman ...
- php_常用操作_读取文件_数据库操作
作为php新手 ,把经常用到的phpcode,做个备份 1: 文件处理 //读取配置 启动是指定文件 $filepath=$argv[1]; if(null==$filepath){ echo&quo ...
- Swift # 异常处理
面向轨道编程 - Swift 中的异常处理 问题 在开发过程中,异常处理算是比较常见的问题了. 举一个比较常见的例子:用户修改注册的邮箱,大概分为以下几个步骤: 接收到一个用户的请求:我要修改邮箱地址 ...
- C++外观设计模式模式(三)
3.外观模式总结 引入了外观类.解除了客户类与子系统的耦合性.客户类不须要直接操作子系统,而是由外观类负责处理,对client而言是透明的,客户类仅仅须要操作外观类就能够了,符合"迪迷特法则 ...
- 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍
转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...
- JavaScript时间工具类
/** * JavaScript日期工具类 * @author ZhangLp */ /** * 获取当前月的第一天 */ function getCurrentMonthFirst(){ var d ...
- LeetCode——Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
- jq toggle1.9版本后不支持解决方案
<script type="text/javascript"> $(document).ready(function(){ $("button"). ...