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.每一步以相等的概率随机选 ...
随机推荐
- 使用SharePoint创建和定义自己的网站页面
使用SharePoint创建和定义自己的网站页面 1. 打开SharePoint Designer 2010. 2. 点击网站页面导航. 3. 在功能区点击Web部件页面,新建Employee.axp ...
- linux_曝出重大bash安全漏洞及修复方法
日前Linux官方内置Bash中新发现一个非常严重安全漏洞(漏洞参考https://access.redhat.com/security/cve/CVE-2014-6271 ),黑客可以利用该Bas ...
- JavaScript中获取当前项目的绝对路径
近期在做JavaWeb项目相关的东西,差点儿每天都遇到非常多问题,主要是由于自己对JavaWeb方面的知识不是非常清楚,尽量把自己在项目中遇到的问题都记录下来,方便以后查阅. 在我们的项目中有这种须要 ...
- C# mongodb 1
转载C# mongodb 概述 MongoDB是一个高性能,开源,无模式的文档型数据库,使用C++开发.是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他 ...
- F4107Usart数据处理程序
解决:Cortex-M4上,usart自己主动发送数据计划. 1. usart快速突破.数据还没有被处理.usart中断会把盖掉的数据不被处理. 数据丢失. 2.此过程需要main处理4一个usart ...
- Swift # 异常处理
面向轨道编程 - Swift 中的异常处理 问题 在开发过程中,异常处理算是比较常见的问题了. 举一个比较常见的例子:用户修改注册的邮箱,大概分为以下几个步骤: 接收到一个用户的请求:我要修改邮箱地址 ...
- vs2012 + web api + OData + EF + MYsql
vs2012 + web api + OData + EF + MYsql 开发及部署 先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发 ...
- [CLR via C#]1.2 将托管模块合并成程序集
原文:[CLR via C#]1.2 将托管模块合并成程序集 1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的. 2. 程序集是一个或多个托管模块/资源文件的逻辑性分组. 3. 程序 ...
- WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...
- A WebBrowser Toy
原文:A WebBrowser Toy 记得上大学时,某老师为了防止学生上课不听讲,只准学生在课堂上看他放映的PPT,不准学生拷贝,而考试的内容恰恰是PPT上的内容,于是一个同学来找我,我就用VB写了 ...