题目描述
天好热……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<1000),坐标图的长x,宽y(5<=x,y<=25){太长打起来好累……},和整张坐标图。
输出
判断按照最优方案是否可以赶在冰淇淋融化之前到达冰淇淋店(注:当T=最优方案所用时间,则判断为未赶到),如赶到,输出所用时间;如未赶到,输出Tina的哭声——“55555”(不包括引号)。
样例输入
11
10
8
......s...
..........
#ooooooo.o
#.........
#.........
#.........
#.....m...
#.........
样例输出
10
提示
Code:
#include <iostream>
#include <queue>
#include <cstring>
#define SIZE 31
using namespace std;
struct node
{
int x, y, step;
};
queue<node> 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循环节)
千万要注意数字个数,否则吗,就会······