| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 10881 | Accepted: 4678 |
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
Source
题目链接:一个迷宫,S为起点,E为终点。
三种方法从S到E:1.从前进方向的左侧开始顺时针寻找下一个可行点;
2.从前进方向的右侧开始逆时针寻找下一个可行点;
3.找最短路径;
求分别通过这三种方法走过的格子数。
解题思路:前两种方法用DFS,四个方向,若是方法一,下一个点不可行时,顺时针判断下一个点,可行时,逆时针回到上一个方向。即nextdex=(dex+1)%4和nextdex=(dex+3)%4,方法二直接两个式子位置互换。找最短路显然用BFS,要注意visit数组的标记!!当时忘了TLE了好久。
代码如下:
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
char a[42][42];
int vis[42][42];
int n,m,cnt;
bool p;
struct node //每个格子的信息,num是起点到当前格子的步数
{
int x,y,num;
};
void dfsl(int x,int y,int i) //左转优先
{
if(p||a[x][y]=='E')
{
p=true;
return ;
}
int cx=x+dx[i];
int cy=y+dy[i];
while(cx<0||cx>=n||cy<0||cy>=m||a[cx][cy]=='#')//下一个点不可行
{
i=(i+3)%4; //顺时针转判断下一个点
cx=x+dx[i];
cy=y+dy[i];
}
cnt++;
dfsl(cx,cy,(i+1)%4); //下一个点可行,方向逆时针回到上一个方向
}
void dfsr(int x,int y,int i) //右转优先,和左转优先正好相反
{
if(p||a[x][y]=='E')
{
p=true;
return ;
}
int cx=x+dx[i];
int cy=y+dy[i];
while(cx<0||cx>=n||cy<0||cy>=m||a[cx][cy]=='#')
{
i=(i+1)%4;
cx=x+dx[i];
cy=y+dy[i];
}
cnt++;
dfsr(cx,cy,(i+3)%4);
}
int bfs(int sx,int sy) //找最短路径
{
queue<node>q;
node sd;
sd.x=sx;
sd.y=sy;
sd.num=1;
q.push(sd);
vis[sx][sy]=1; //起点也要标记
while(!q.empty())
{
node no=q.front();
q.pop();
for(int i=0;i<4;i++)//每个方向都要判断
{
int cx=no.x+dx[i];
int cy=no.y+dy[i];
if(vis[cx][cy]||cx<0||cx>=n||cy<0||cy>=m||a[cx][cy]=='#')
continue; //下一个点不可行,换一个方向
sd.x=cx; //下一个点可行,步数加以后加入队列
sd.y=cy;
sd.num=no.num+1;
vis[cx][cy]=1;
if(a[cx][cy]=='E')
return sd.num;
q.push(sd);
}
}
}
int main()
{
int t,sx,sy;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++)
{
scanf("%s",&a[i]);
for(int j=0;j<m;j++)
{
if(a[i][j]=='S')
{
sx=i;
sy=j;
}
}
}
cnt=1,p=false;
dfsl(sx,sy,0);
printf("%d ",cnt);
cnt=1,p=false;
dfsr(sx,sy,0);
printf("%d ",cnt);
printf("%d\n",bfs(sx,sy));
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
poj 3083 Children of the Candy Corn (DFS+BFS)
原文地址:http://blog.csdn.net/criminalcode/article/details/46811119