| 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