poj3083
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 8046 | Accepted: 3518 |
Description
One popular maze-walking strategy guarantees that the visitor will eventually find the exit. Simply choose either the right or left wall, and follow it. Of course, there's no guarantee which strategy (left or right) will be better, and the path taken is seldom the most efficient. (It also doesn't work on mazes with exits that are not on the edge; those types of mazes are not represented in this problem.)
As the proprieter of a cornfield that is about to be converted into a maze, you'd like to have a computer program that can determine the left and right-hand paths along with the shortest path so that you can figure out which layout has the best chance of confounding visitors.
Input
Exactly one 'S' and one 'E' will be present in the maze, and they will always be located along one of the maze edges and never in a corner. The maze will be fully enclosed by walls ('#'), with the only openings being the 'S' and 'E'. The 'S' and 'E' will also be separated by at least one wall ('#').
You may assume that the maze exit is always reachable from the start point.
Output
Sample Input
2
8 8
########
#......#
#.####.#
#.####.#
#.####.#
#.####.#
#...#..#
#S#E####
9 5
#########
#.#.#.#.#
S.......E
#.#.#.#.#
#########
Sample Output
37 5 5
17 17 9
#include<iostream>
#include<stdio.h>
using namespace std;
int w,h,ex,ey,sx,sy;
int map[100][100],can[100][100];
struct vid{ int x,y,step;
}queue[5000];
int zan[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int dirl[4][2]={0,-1,-1,0,0,1,1,0},dirr[4][2]={0,1,1,0,0,-1,-1,0};
int dfsr(int dstep,int x,int y,int di )
{
int i,temp1,temp2; for(i=0;i<4;i++)
{
temp1=x+dirr[i][0];
temp2=y+dirr[i][1]; if((temp1>=0)&&(temp1<h)&&(temp2>=0)&&(temp2<w))
{
if(dfsr(dstep+1,x+dirr[i][0],y+dirr[i][1],i))
return dstep;
else
return 0;
} }
return 0; }
int dfsl(int dstep,int x,int y,int di )
{ int i,temp1,temp2; for(i=0;i<4;i++)
{
temp1=x+dirl[i][0];
temp2=y+dirl[i][1]; if((temp1>=0)&&(temp1<h)&&(temp2>=0)&&(temp2<w))
{
if(dfsl(dstep+1,temp1,temp2,i))
return dstep;
else
return 0;
} } return 0;
}
int bfs()
{ if (sx == ex && sy == ey)
{ return 1;
}
int t,ww,x,y,t1,t2;
t=ww=1;
queue[t].x=sx;
queue[t].y=sy;
queue[t].step=0;
can[sx][sy]=1;
while(t<=ww&&!can[ex][ey])
{ x=queue[t].x;
y=queue[t].y;
for(int i=0;i<4;i++)
if((!map[x+zan[i][0]][y+zan[i][1]])&&(!can[x+zan[i][0]][y+zan[i][1]]))
{ t1=x+zan[i][0];
t2=y+zan[i][1];
if(t1>=0&&(t1<h)&&(t2>=0)&&(t2<w)&&(!map[t1][t2])&&(!can[t1][t2]))
{ queue[++ww].x=t1;
queue[ww].y=t2;
queue[ww].step=queue[t].step+1;
can[t1][t2]=1;
}
}
t++;
}
return queue[ww].step+1;
}
int main ()
{
int t;
char c;
scanf("%d",&t);
getchar();
while(t--)
{ scanf("%d%d",&w,&h);
getchar();
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
can[i][j]=0;
c=getchar();
if(c=='#')
map[i][j]=1;
else if(c=='.')
map[i][j]=0;
else if(c=='S')
{
map[i][j]=0;
sx=i,sy=j;
}
else
if(c=='E')
{
map[i][j]=0;
ex=i;ey=j;
}
}
getchar();
}
// init();
// dfsr();
// printf("%d ",bfs());
printf("%d %d %d\n",dfsl(0,sx,sy,0)+1,dfsr(0,sx,sy,0)+1,bfs());
} return 0;
}
poj3083的更多相关文章
- ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)
//POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...
- POJ3083——Children of the Candy Corn(DFS+BFS)
Children of the Candy Corn DescriptionThe cornfield maze is a popular Halloween treat. Visitors are ...
- POJ3083 Children of the Candy Corn(搜索)
题目链接. 题意: 先沿着左边的墙从 S 一直走,求到达 E 的步数. 再沿着右边的墙从 S 一直走,求到达 E 的步数. 最后求最短路. 分析: 最短路好办,关键是沿着墙走不太好想. 但只要弄懂如何 ...
- poj3083走玉米地问题
走玉米地迷宫,一般有两种简单策略,遇到岔路总是优先沿着自己的左手方向,或者右手方向走.给一个迷宫,给出这两种策略的步数,再给出最短路径的长度. ######### #.#.#.#.# S....... ...
- POJ3083 Children of the Candy Corn(Bfs + Dfs)
题意:给一个w*h的迷宫,其中矩阵里面 S是起点,E是终点,“#”不可走,“.”可走,而且,S.E都只会在边界并且,不会在角落,例如(0,0),输出的话,每组数据就输出三个整数,第一个整数,指的是,以 ...
- POJ-3083 Children of the Candy Corn (BFS+DFS)
Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...
- DFS+BFS(POJ3083)
题目链接:http://poj.org/problem?id=3083 解题报告:这个题目,搜最短路,没有什么问题.优先走左边,走右边,有很多说法,思路大概都相同,都是记录当前朝向,根据数学公式(i+ ...
- poj3083 Children of the Candy Corn BFS&&DFS
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11215 Acce ...
- 基础BFS+DFS poj3083
//满基础的一道题 //最短路径肯定是BFS. //然后靠右,靠左,就DFS啦 //根据前一个状态推出下一个状态,举靠左的例子,如果一开始是上的话,那么他的接下来依次就是 左,上 , 右 , 下 // ...
随机推荐
- log4j配置webapp日志系统
1.基础知识: Log4j的中文文档 (这是根据最新的log4j(jakarta-log4j-1.2.8)的开发包自带文档的manual翻译的) http://dev.csdn.net/develop ...
- asp.net的decimal保留两位小数
C#的decimal保留两位小数 方法一: decimal d = 46.28111; string dStr = Math.Round( d,2 ).ToString(); 结果:dStr = 46 ...
- busybox filesystem ifup
/******************************************************************** * busybox filesystem ifup * 声明 ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- Nginx - 指定log_format,常用于 Awstats 分析
1. vim /etc/nginx/nginx.conf (下面格式, Awstats 使用) log_format new_log '$remote_addr - $remote_user [$ti ...
- Java [Leetcode 189]Rotate Array
题目描述: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ...
- Oracle Analyze 命令 详解
官网的链接如下: http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_4005.htm#SQLRF01105 使用DBMS ...
- 【应聘】阿里巴巴Java面试题目
原文地址:http://blog.csdn.net/free0sky/article/details/7927275 一.String,StringBuffer, StringBuilder 的区 ...
- 【原】cocos2d-x 2.0.4 不支持https协议 CURLE_UNSUPPORTED_PROTOCOL
我们项目组用的cocos2d-x版本还比较老,各种好的功能不能用. 今天就让我遇到一个问题,使用CCHttpClient发送http请求的时候,https协议的不支持,返回失败信息如下 errorco ...
- 安卓dalvik和art区别
Dalvik模式像是一台折叠自行车,每次骑之前都要组装后才能上路.而ART模式就是一个已经装好的自行车,直接就能上车走人.所以ART模式在效率上肯定是要好于Dalvik. 通过以上这种表格,我们可以直 ...