#47-【BFS】ice-cream

题目描述

天好热……Tina顶着那炎炎的烈日,向Ice-cream home走去……
可是……停电了……
冰淇淋们躺在Ice-cream home的冰柜里,慢慢地……慢慢地……融化…………
你说,她能赶在冰淇淋融化完之前赶到Ice-cream home去吗?  
给你一张坐标图,s为Tina的初始位置,m为Ice-cream home的位置,‘.’为路面,Tina在上面,每单位时间可以移动一格;‘#’为草地,Tina在上面,每两单位时间可以移动一格(建议不要模仿—毕竟Tina还小);‘o’是障碍物,Tina不能在它上面行动。也就是说,Tina只能在路面或草地上行走,必须绕过障碍物,并到达冰淇淋店。但是…………不保证到达时,冰淇淋还未融化,所以……就请聪明的你……选择最佳的方案啦…………如果,Tina到的时候,冰淇淋已经融化完了,那她可是会哭的。

 

输入

依次输入冰淇淋的融化时间t(0

输出

判断按照最优方案是否可以赶在冰淇淋融化之前到达冰淇淋店(注:当T=最优方案所用时间,则判断为未赶到),如赶到,输出所用时间;如未赶到,输出Tina的哭声——“55555”(不包括引号)。

样例输入

11
10
8
......s...
..........
#ooooooo.o
#.........
#.........
#.........
#.....m...
#.........

样例输出

10 

提示

Code:

#include 
#include 
#include 

#define SIZE 31

using namespace std;

struct node
{
	int x, y, step;
};

queue q;
char c[SIZE][SIZE];
int best[SIZE][SIZE]; // 存储最少时间
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
bool visited[SIZE][SIZE];

int main(int argc, char** argv)
{
	int i, j, t, n, m, r, c, sx, sy, ex, ey, temp, res = 1e+09;
	bool flag = false;
	
	memset(best, 127, sizeof (best));
	
	scanf("%d%d%d", &t, &m, &n);
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= m; j++)
		{
			cin >> ::c[i][j];
			if (::c[i][j] == 'o')
			{
				visited[i][j] = true;
			}
			else if (::c[i][j] == 's')
			{
				visited[i][j] = true;
				sx = i;
				sy = j;
				best[i][j] = 0;
			}
			else if (::c[i][j] == 'm')
			{
				ex = i;
				ey = j;
			}
		}
	}
	
	q.push({sx, sy, 0});
	while (!q.empty()) // 基本······广搜······
	{
		best[q.front().x][q.front().y] = q.front().step;
		for (i = 0; i < 4; i++)
		{
			r = q.front().x + dx[i];
			c = q.front().y + dy[i];
			if ((!visited[r][c]) && (((r) && (c)) && ((r <= n) && (c <= m))))
			{
				if (::c[r][c] == '#')
				{
					temp = q.front().step + 2;
				}
				else
				{
					temp = q.front().step + 1;
				}
				if (temp >= best[r][c])
				{
					continue;
				}
				best[r][c] = temp; // 更新最短时间
				// visited[r][c] = true;
				if (::c[r][c] == 'm')
				{
					flag = true;
				}
				q.push({r, c, temp});
			}
		}
		q.pop();
	}
	
	if ((best[ex][ey] >= t) || (!flag)) // 超过时间,输出无解55555
	{
		printf("55555");
	}
	else // 否则,输出最短时间
	{
		printf("%d", best[ex][ey]);
	}
	
	return 0;
}

PS:

最坑的是无解输出······有人打出了4个5,结果60,

世界上最难的输出是网络用语

(几个拖很长的网络用语)

555···(5循环节)

666···(6循环节)

233···(3循环节)

千万要注意数字个数,否则吗,就会······

你可能感兴趣的:(刷题,最优问题,搜索,BFS,最短路,gdgzoi刷题)