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啦 //根据前一个状态推出下一个状态,举靠左的例子,如果一开始是上的话,那么他的接下来依次就是 左,上 , 右 , 下 // ...
随机推荐
- poj 1067 取石子游戏( 威佐夫博奕)
题目:http://poj.org/problem?id=1067 题意:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的 ...
- Servlet和JAVA BEAN 分析探讨
在JSP中调用JAVA类和使用JavaBean有什么区别? 可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类.特殊在可以通过<jsp:useBean />调用Jav ...
- highcharts 设置标题不显示
设置标题不显示:title:false 用法: title: { text: false },
- codeforces 340A The Wall(简单数学题)
题意:输入a,b,x,y,a,b分别是两人的步数(每a块砖,刷一次),则有一些砖被两人同时刷到了,问[x,y]区间内有多少块砖同时被两人刷到. 分析:就是求[x,y]中有多少个能把a,b的最小公倍数l ...
- Java [Leetcode 202]Happy Number
题目描述: Write an algorithm to determine if a number is "happy". A happy number is a number d ...
- 【C#学习笔记】指针使用
using System; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { ; un ...
- 众神看过来:IE11下鼠标中键(滚轮)导致的一个似乎无法解决的问题?!
最近在做asp.net mvc项目时遇到一个关于超链接的问题.很是纠结. 问题描述 有一个公司列表展示页.在用鼠标中键(注意了是滚轮)以下简称中键,点击编辑(超链接)的时候在该条数据的下面直接加在一个 ...
- poj 1392 Ouroboros Snake
题目描述:咬尾蛇是古埃及神话中一种虚构的蛇.它经常把尾巴放在自己的嘴巴里,不停地吞噬自己.环数类似于咬尾蛇,它是2^n位的二进制数,具有如下性质:它能“生成”0-2^n-1之间的所有数.生成方法是:给 ...
- 【Unity3D】枪战游戏—弹孔设置
以子弹为原点,发射射线,如果射线检测到障碍物,则返回射线与障碍物的碰撞点 在该点处实例化出弹孔贴图 void Update () { transform.Translate (Vector3.forw ...
- 130道ASP.NET面试题
转:http://boke.25k5.com/kan88569.html 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . privat ...