您的位置:首页 > 其它

深度优先搜索之拯救ice-cream

2009-09-09 12:48 155 查看
背景 Background
天好热……Tina顶着那炎炎的烈日,向Ice-cream home走去……
可是……停电了……
冰淇淋们躺在Ice-cream home的冰柜里,慢慢地……慢慢地……融化…………
你说,她能赶在冰淇淋融化完之前赶到Ice-cream home去吗?

描述 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<cstring>
#include<cstdio>
#include<iostream>
using namespace
std;

const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
char map[30][30];
int F[30][30];
int
n,m,t,bx,by,ex,ey;
bool check(int x,int
y)
{
if (x>0 && x<=n && y>0 && y<=m) return true
;
return false
;
}
void dfs(int x,int y,int
dep)
{
F[x][y]=dep
;
if (x==ex && y==ey) return
;
int
tx,ty,s;
for (int i=0;i<=3;i++
)
{
tx=x+dx[i]; ty=y+dy[i];
if (check(tx,ty) && map[tx][ty]!='o'
)
{
if (map[tx][ty]=='.') s=1
;
else s=2
;
if (s+dep<F[tx][ty]) dfs(tx,ty,s+dep
);
}
}
}
int
main()
{
scanf("%d%d%d",&t,&m,&
n); getchar();
for (int i=1;i<=n;i++
)
{
for (int j=1;j<=m;j++
)
{
scanf("%c",&map[i][j]);
if (map[i][j]=='s'
)
{
bx=i; by=j; map[i][j]='.'
;
}
else if (map[i][j]=='m'
)
{
ex=i; ey=j; map[i][j]='.'
;
}
}
getchar();
}
for (int i=1;i<=n;i++
)
for (int j=1;j<=m;j++
)
F[i][j]=1010
;
dfs(bx,by,0
);
int Min=F[ex][ey];
if (Min>=t) printf("55555/n"
);
else printf("%d/n",Min
);
return 0
;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: