openjudge7218——“献给阿尔吉侬的花束”简要题解

题目链接:http://noi.openjudge.cn/ch0205/7218/
思路:广搜。打好四个方向的表,用h数组记录答案,上下左右移动,遇到可以走的路就放进队尾,第一个搜到的就是答案,如果队列空了还没有搜到一个答案的话,视为无解。
代码:

#include 
#include 
#include 
using namespace std;
int m, n, t, ex, ey;
char s[1001][1001];
bool pd[1001][1001], b;
int h[10001][4];
int dx[4]={-1, 0, 1, 0};//打表
int dy[4]={0, 1, 0, -1};//打表
int main()
{
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d %d", &m, &n);
		memset(pd, false, sizeof(pd));//清零
		b = false;//清零
		for(int i = 1; i <= m; i++)
		{
			for(int j = 1; j <= n; j++)
			{
				cin >> s[i][j];
				if(s[i][j] == 'S')
				{
					h[1][1] = i;//起点的x坐标是i
					h[1][2] = j;//起点的y坐标是j
					h[1][3] = 0;//答案清零
				}
				if(s[i][j]=='E')
				{
					ex = i;//终点的x坐标是i
					ey = j;//终点的y坐标是j
					pd[i][j] = true;//标记终点可走
				}
				if(s[i][j]=='.')
				{
					pd[i][j] = true;//标记此位置可走
				}
			}
		}
		int t = 0;//队头
		int w = 1;//队尾
		do
		{
			t++;//队头元素出队
			for(int i = 0; i < 4; i++)
			{
				int xx = dx[i] + h[t][1];//新位置的x坐标
				int yy = dy[i] + h[t][2];//新位置的y坐标
				if(xx > 0 && xx <= m && yy > 0 && yy <= n && pd[xx][yy])
				{
					w++;//新元素入队
					h[w][1] = xx;//记录新元素的x坐标
					h[w][2] = yy;//记录新位置的y坐标
					h[w][3] = h[t][3] + 1;//计算到达此地点的时间
					pd[xx][yy] = false;//标记此地点已走过
					if(xx == ex && yy == ey)//如果到达了终点
					{
						printf("%d\n", h[w][3]);//输出答案
						b = true;//标记此迷宫有解
					}
				}
			}
		}while(t < w && b == false);//如此循环直到队列中无元素或已搜到答案
		if(b == false)//如果此迷宫无解
		{
			printf("oop!\n");//输出“oop!”
		}
	}
	return 0;//程序拜拜
}

小弟的第一篇题解,不喜勿喷。

你可能感兴趣的:(题解)