走玉米地迷宫,一般有两种简单策略,遇到岔路总是优先沿着自己的左手方向,或者右手方向走。给一个迷宫,给出这两种策略的步数,再给出最短路径的长度。

#########
#.#.#.#.#
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走玉米地问题的更多相关文章

  1. ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)

    //POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...

  2. SQLSERVER走起微信公众帐号已经开通搜狗微信搜索

    SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...

  3. SQLSERVER走起 APP隆重推出

    SQLSERVER走起 APP隆重推出 为方便大家查看本微信公众以前推送的文章,QQ群里面的某位SQLSERVER重度爱好者开发了<SQLSERVER走起>的APP 以供大家一起交流 网页 ...

  4. SQLSERVER走起微信公众帐号全新改版 全新首页

    SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...

  5. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  6. 游走 bzoj 3143

    游走(2s 128MB)walk [问题描述] [输入格式] [输出格式] [样例输入] 3 3 2 3 1 2 1 3 [样例输出] 3.333 [样例说明] 题解: 主要算法:贪心:高斯消元: 题 ...

  7. 1226关于count(*)不走主键索引反而走二级索引

    转自 http://www.2cto.com/database/201508/433975.html mysqlcount(*)会选哪个索引? 2015-08-19      0个评论    来源:D ...

  8. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  9. 【bzoj3143】 Hnoi2013—游走

    http://www.lydsy.com/JudgeOnline/problem.php?id=3143 (题目链接) 题意 一个无向连通图,顶点从1编号到N,边从1编号到M.每一步以相等的概率随机选 ...

随机推荐

  1. Android手游《》斗地主完整的源代码(支持单机和网络对战)

    Android手游<斗地主>完整的源代码(支持单机和网络对战)下载.一个很不错的源代码. 斗地主掌游是一个独特的国内社会斗地主棋牌游戏,之后玩家可以下载网上斗地主和全世界.掌游斗地主特点: ...

  2. oracle_修改连接数

    修改Oracle最大连接数 1.查询Oracle会话的方法   select * from v$session 2.修改Oracle最大连接数的方法      a.以sysdba身份登陆PL/SQL ...

  3. Fun<>,匿名方法,Lambda表达式 冒泡排序C#

    大头文 分享,进步 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式 冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更 ...

  4. 教你一步一步部署.net免费空间OpenShift系列之四------绑定域名、使用CDN加速

    很抱歉这几天没有时间,有人问我怎么绑定域名的问题也没有答复,下面进入正题,惊闻ASP.Net要开源了,难道.Net春天要来了?不废话,上回书说,部署完毕ASP.Net网站后,直接访问不能访问(嗯,众所 ...

  5. 电脑报2014年第43期 pdf高清版

    电脑报2014年第43期 pdf高清版

  6. 只显示年月的js时间控件 纯手写

    <style> #date { text-align: center; } .td { cursor: pointer; } </style> <script> f ...

  7. CSS下背景属性background的使用方法

    背景颜色(background-color) CSS可以用纯色来作为背景,也可以将背景设置为透明,background相当于xhtml中的bgcolor. 它的两个值: transparent(默认值 ...

  8. Floodlight controller 线程池模型

         官方文档对于ThreadPool的描写叙述是:ThreadPool is a Floodlight module wrapper for a Java's ScheduledExecutor ...

  9. WP 开发中.xaml 与.xaml.cs

    关于 WP 开发中.xaml 与.xaml.cs 的关系   今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...

  10. jQuery小例

    jQuery小例子 使用前,请先引用jquery 1,map遍历数组   2,jQuery对象与DOM对象才做元素和互转 3,prevall与nextall 4,jquery版的星星评分控件 5,jq ...