http://poj.org/problem?id=3083
入口S,出口E,分别求由入口 到出口靠左走,靠右走,和最短路三种走法各自的步数。入口和出口在边界处,并且不会在四个角上,入口和出口至少隔着一个阻碍。
本来是想找一个广搜和深搜结合的题目,百度一下找到的这题,后来发现这题所谓的广搜加深搜只是用深搜找一条路径,而用广搜找另外一条路径,。根本不是我希望的广搜和深搜的结合。
不过既然题目已经看了,还是做一做吧。求最短路的没什么好说的,用一下广搜就可以解决问题了。主要是靠左走和靠右走的部分,这里用到了两个数组,dirx[],diry[],共同来确定方向。dirx[],diry[],数组的下标增1对4求余代表顺时针方向,来处理向左走。同样下标增3对4求余代表逆时针方向,来处理向右走。
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <iostream>
#include<queue>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dirx[4]={0,-1,0,1};
int diry[4]={-1,0,1,0};//dirx,diry数组下标:0左,1上,2右,3下;
int co,ro,ansr,ansl,ansm;
char map[45][45];
struct coor
{
int x,y,z;
int time;
};
bool visited[45][45];
void dfsl(int,int,int,int);
void dfsr(int,int,int,int);
void dfsl(int a,int b,int time,int c)
{
int i,x,y;
if(map[a][b]=='E')
{
ansl=time;
return;
}
c=(c+3)%4;  //靠左走;这样c总是原来方向的左面一个方向,
for(i=0;i<4;i++)
{
x=a+dirx[c];
y=b+diry[c];
if(!(x<0||y<0||x>=co||y>=ro||map[x][y]=='#'))
{
dfsl(x,y,time+1,c);
break;
}
c=(c+1)%4; //顺时针方向
}
}
void dfsr(int a,int b,int time,int c)
{
int i,x,y;
if(map[a][b]=='E')
{
ansr=time;
return;
}
c=(c+1)%4;// 靠右走;这样c总是原来方向的右面一个方向。
for(i=0;i<4;i++)
{
x=a+dirx[c];
y=b+diry[c];
if(!(x<0||y<0||x>=co||y>=ro||map[x][y]=='#'))
{
dfsr(x,y,time+1,c);
break;
}
c=(c+3)%4; //逆时针方向
}
}
bool check(int x,int y)
{
if(x<0 || y<0 || x>=co || y>=ro) return false;
if(map[x][y]=='#' || visited[x][y]) return false;
return true;
}
void bfs(int a,int b)
{
int i,j,k,l,front=-1,rear=-1;
coor out,in;
queue <coor> que;
in.x=a;
in.y=b;
in.time=1;
que.push(in);
visited[a][b]=true;
while(!que.empty())
{
out=que.front();
que.pop();
if(map[out.x][out.y]=='E')
{
ansm=out.time;
return;
}
for(l=0;l<4;l++)
{
i=out.x+dir[l][0];
j=out.y+dir[l][1];
if(!check(i,j)) continue;
visited[i][j]=true;
in.x=i;
in.y=j;
in.time=out.time+1;
que.push(in);
}
}
}
int main()
{
int cas,i,j,a,b,c;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&ro,&co);
//getchar();
for(i=0;i<co;i++)
scanf("%s",map[i]);
for(i=0;i<co;i++)
for(j=0;j<ro;j++)
if(map[i][j]=='S')
{
a=i;
b=j;
}
map[a][b]='#';
if(b==ro-1)
c=0;
else if(a==co-1)
c=1;
else if(b==0)
c=2;
else if(a==0)
c=3;
dfsl(a,b,1,c);
dfsr(a,b,1,c);
memset(visited,false,sizeof(visited));
bfs(a,b);
printf("%d %d %d\n",ansl,ansr,ansm);
}
system("pause");
return 0;
}

转载于:https://www.cnblogs.com/zxj015/archive/2011/04/01/2740246.html

poj 3038 Children of the Candy Corn bfs dfs相关推荐

  1. poj 3083 Children of the Candy Corn(bfs+dfs 数组模拟方向)

    好纠结啊,方向转晕了~~~~~先贴个半山寨的代码 #include <cstdio>#include<string.h>#define MAX 45 struct node{i ...

  2. poj3083 Children of the Candy Corn 深搜+广搜

    这道题有深搜和广搜.深搜还有要求,靠左或靠右.下面以靠左为例,可以把简单分为上北,下南,左西,右东四个方向.向东就是横坐标i不变,纵坐标j加1(i与j其实就是下标).其他方向也可以这样确定.通过上一步 ...

  3. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  4. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  5. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  6. LeetCode 1034. 边框着色(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色. 只有当两个网格块的颜色相同,而且在四个方向中任 ...

  7. 全局路径规划:图搜索算法介绍1(BFS/DFS)

    对于全局路径规划的设计,我们先要了解什么是图搜索,在此之前,要先知道什么是图: 可以看到,图有很多种,有无向图,有向图,节点之间还可以有不同的weight, 用于表述从节点与节点直接迁移的代价. 而图 ...

  8. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  9. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

最新文章

  1. python construct_Python construct包_程序模块 - PyPI - Python中文网
  2. 【学术相关】一院士给博士生的一封信:每天工作12小时,这仅是一个下限!...
  3. iptables复习记忆
  4. 【git】git基本操作命令
  5. 权限管理系统_在Gitee狂揽11K Star!这个SpringCloud的权限管理系统你必须知道
  6. linux-修改pip包的下载源-改为国内境象提升速度
  7. 湖北职业技术学院计算机协会,湖北职业技术学院2019年教师教学能力大赛顺利举行...
  8. 小米改鸿蒙系统,小米、OV傻眼 魅族要用鸿蒙系统!
  9. 第3章 FOR命令中的变量
  10. 几十种编程语言说Hello World
  11. IE6.0中getElementsByName和getElementById的bug
  12. android rom制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...
  13. 用户使用什么命令访问远程计算机,远程桌面连接命令是什么 怎么使用命令连接远程服务器...
  14. 中学计算机课教具,中学教师20余载自制教具 “变废为宝”让课堂易懂
  15. 第二类曲面积分、场论、高斯公式和斯托克斯公式
  16. 黑马头条推荐系统完整版(包括虚拟机和数据,代码已修复过可完美跑起来)
  17. db2获取当前日期、时间、时间戳、年份
  18. ScrollView和GestureDetector触屏事件冲突
  19. 一、Java语言简介
  20. 计算机系统 ahci模式,打开ahci模式后需要重装系统吗

热门文章

  1. ssh架构之hibernate(一)简单使用hibernate完成CRUD
  2. Spark系列(八)Worker工作原理
  3. MongoDB 权限
  4. WampServer修改MySQL密码的问题
  5. 【DS】排序算法之归并排序(Merge Sort)
  6. Vue iView Admin 动态路由菜单加载 前后端分离(springboot 2.x iview admin vue 前后端分离 模型设计器 动态数据权限...
  7. OkHttpClient源码分析(五)—— ConnectInterceptor和CallServerInterceptor
  8. 小程序存emoji表情 不改变数据库
  9. 禁止解析PHP、限制user_agent、php相关配置
  10. React Native For Android 环境搭建