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.每一步以相等的概率随机选 ...
随机推荐
- Windows移动开发(一)——登堂入室
開始本博客之前先分享一个自己的好消息吧,2014年3月31日起,正式就职于北京****集团Win8project师.主要负责将IOS和Android应用移植到Win8.1平板上,目标客户是银行,闲话不 ...
- ASP.NET——RequiredFieldValidator控制和ValidationSummary控制
我们的登录页面,忘记承担损失password然后username,该页面将永远是一个小提醒. 那么我们在网也制作的时候怎样实现这一功能呢?这就用到了RequiredFieldValidator控件和V ...
- 九度OJ 1068 球半径和数量 (模拟)
题目1068:球的半径和体积 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4797 解决:1696 题目描写叙述: 输入球的中心点和球上某一点的坐标,计算球的半径和体积 输入: 球的中心 ...
- MSSQL Server 2008 数据库安装失败
1.Reporting Services目录临时数据库文件存在 出现这种问题的原因,是由于以前安装的SQL Server2008文件并没有卸载或删除干净造成 解决的办法如下: 找到 ...
- Coreseek/sphinx全文检索的了解
Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的随意内容信息查找出来的检索.它能够依据 ...
- Effective C++:规定34:区分接口继承和实现继承
(一个) class Shape { public: virtual void draw() const = 0; virtual void error(const string& msg); ...
- C# 复习(1) 委托与事件
委托定义顺序 1. 声明一个委托 2.定义一个委托变量 3. 委托变量的初始化或者给委托变量绑定一个方法 4.调用委托 事件:事件是对委托的封装. 事件只能在创建事件的类的内部调用. public c ...
- php生成签名及验证签名
<?php /** * 根据原文生成签名内容 * * @param string $data 原文内容 * * @return string * @author confu */ functio ...
- MySQL在Windows和Linux减少数据库
Linux减少数据库代码: 1,创建一个空数据库cddl mysql> create database cddl; Query OK, 1 row affected (0.00 sec) 2,还 ...
- SQL点滴12—SQL Server备份还原数据库中的小把戏
原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support 1 media families, ...