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

#########
#.#.#.#.#
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. BFS、双向BFS和A*

    BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...

  2. jquery插件之DataTables 参数介绍

    DataTables(http://www.datatables.net/)应该是我到目前为止见过的,功能最强大的表格解决方案(当然,不计算其它整套框架中的table控件在内). 先把它主页上写的特性 ...

  3. SettingsProvider该CRUD

    转载请注明出处:http://blog.csdn.net/droyon/article/details/35558697 什么时候delete要么update时间.需要清空缓存并重新加载数据. 1.i ...

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

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

  5. Socket 由浅入深系列--------- 简单实现编程(三)

    socket 由浅入深 原理(一)介绍了一些,以下也就是简单实现,并未考虑其它性能化! 使用TCP的server客户机举例 server 设置一个简单的TCPserver涉及下列步骤: 调用 sock ...

  6. 用HMM(隐马)图解三国杀的于吉“质疑”

    ·背景 最近乘闲暇之余初探了HMM(隐马尔科夫模型),觉得还有点意思,但是网上的教程都超级枯草,可读性很差,抄来抄去的,一堆公式仍在你面前,谁能搞的懂(但园内的两篇写的还算不错.真才实学).在熬制3天 ...

  7. java中string和int互相转化

    1 怎样将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  8. Java多线程详解

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  9. Linux httpd 跳转简单方法二

    使用mod_proxy 这种方法要添加上mod_proxy_http.so 在httpd.conf 中打开httpd-vhost 在 httpd-vhost 里面添加上 <VirtualHost ...

  10. [Elasticsearch] 集群工作 - 第二部分

    本文翻译自Elasticsearch官方指南的life inside a cluster一章. 添加故障转移(Failover)功能 仅仅执行一个节点意味着可能存在着单点失败(Single point ...