现在的位置: 首页 > 综合 > 正文

POJ 3083 Children of the Candy Corn dfs+bfs

2013年08月10日 ⁄ 综合 ⁄ 共 1323字 ⁄ 字号 评论关闭

题意:给出一个迷宫,不超过40*40。分别求出从起点一直沿左走,一直沿右走,直到终点所需要的步数。以及所需要的最小步数。
题解:用bfs求出最小步数,dfs求一直向左或者向右走得步数。

#include <queue>
#include <iostream>
using namespace std;

char Maze[44][44];
int dirL[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };
int dirR[4][2] = { {0,1}, {-1,0}, {0,-1}, {1,0} };
int sr, sc, er, ec, w, h;
bool vis[44][44];

struct Point
{
	int r, c, step;
} node[42][42];

int dfs ( int r, int c, int way, int dir[][2] )
{
	if ( r == er && c == ec )
		return 1;
	int t, a, b;
	for ( int i = 0; i < 4 ; i++ )
	{
		t = ( way + i ) % 4;
		a = r + dir[t][0];
		b = c + dir[t][1];
		if ( a < h && a >= 0 && b < w && b >= 0 && Maze[a][b] != '#' )
			return dfs ( a, b, (t+3) % 4, dir ) + 1;
	}
	return -1;
}


int bfs()
{
	memset(vis,0,sizeof(vis));
	queue<Point> Q;
	Point current, next;
	current.step = 1;
	current.r = sr;
	current.c = sc;
	vis[sr][sc] = true;
	Q.push ( current );
	while ( ! Q.empty () )
	{
		current = Q.front ();
		Q.pop ();
		if ( current.r == er && current.c == ec )
			return current.step;
		for ( int i = 0; i < 4; i++ )
		{
			int a = current.r + dirL[i][0];
			int b = current.c + dirL[i][1];
			if ( a < h && a >= 0 && b < w && b >= 0  && Maze[a][b] != '#' && ! vis[a][b] )
			{
				next.r = a;
				next.c = b;
				vis[a][b] = true;
				next.step = current.step + 1;
				Q.push ( next );
			}
		}
	}
	return -1;
}

int main()
{
	int n, way;
	scanf("%d",&n); 
	while ( n-- )
	{
		scanf("%d%d",&w,&h); getchar();

		for ( int i = 0; i < h; i++ )
		{
			scanf("%s", Maze[i]);
			for ( int j = 0; j < w; j++ )
			{
				if ( Maze[i][j] == 'S' )
				{
					sr = i;
					sc = j;
				}
				if ( Maze[i][j] == 'E' )
				{
					er = i;
					ec = j;
				}
			}
		}

		if ( sr == 0 )
			way = 0;
		else if ( sc == 0 )
			way = 1;
		else if ( sr == h - 1 )
			way = 2;
		else if ( sc == w - 1 )
			way = 3;

		printf("%d %d %d\n", dfs(sr,sc,way,dirL), dfs(sr,sc,way,dirR), bfs() );
	}
	return 0;
}

抱歉!评论已关闭.