您的位置:首页 > 编程语言 > PHP开发

【搜索】拯救ice-cream

2012-05-25 12:15 309 查看
描述 Description

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

输入格式 Input Format

依次输入冰淇淋的融化时间t(0<t<1000),坐标图的长x,宽y(5<=x,y<=25){太长打起来好累……},和整张坐标图。

输出格式 Output Format

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

样例输入 Sample Input

11

10

8

......s...

..........

#ooooooo.o

#.........

#.........

#.........

#.....m...

#.........

样例输出 Sample Output

10

时间限制 Time Limitation

  各个测试点1s

宽搜,拆点,草地拆成两个点。

#include <cstdio>
#include <string>

long que[1000000];
long tim[1000000];
char map[1000000];

#define MOVE(a,b) (b==0?(a-(m+1)):(b==1?(a+(m+1)):(b==2?(a-1):(a+1))))

long S,M;
long t,m,n;
long getint()
{
long rs=0;char tmp;bool sgn=1;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){sgn=0;tmp=getchar();}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
int main()
{
freopen("icecream.in","r",stdin);
freopen("icecream.out","w",stdout);
scanf("%ld%ld%ld",&t,&m,&n);
for (long i=1;i<n+1;i++)
{
getchar();
for (long j=1;j<m+1;j++)
{
map[i*(m+1)+(j)] = getchar();
if (map[i*(m+1)+(j)] == 's')
S = i*(m+1)+(j);
if (map[i*(m+1)+(j)] == 'm')
{
map[i*(m+1)+(j)] = '.';
M = i*(m+1)+(j);
}
if (map[i*(m+1)+(j)] == 'o')
map[i*(m+1)+(j)] = 0;
}
}
long edge = n*(m+1)+(m+1);
long l = 0;
long r = 0;
que[++r] = S;
map[S] = 0;
tim[r] = 0;
while (l < r)
{
long u = que[++l];
if (u == M)
{
if (tim[l] < t)
{
printf("%ld",tim[l]);
return 0;
}
else
{
break;
}
}
if (u > edge)
{
que[++r] = u-edge;
map[u-edge] = 0;
tim[r] = tim[l] + 1;
}
else
{
for (long d=0;d<4;d++)
{
long v = MOVE(u,d);
if (map[v] > 0)
{
if (map[v] == '#')
{
que[++r] = v+edge;
tim[r] = tim[l] + 1;
}
if (map[v] == '.')
{
que[++r] = v;
map[v] = 0;
tim[r] = tim[l] + 1;
}
}
}
}
}
printf("55555");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  output input 测试