背景 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
分析:
简单的DFS练习题。
用F[x][y]表示达到(x,y)点的最小步数,用DFS拓展所有的字状态,记录每个点的最优值即可。
【参考程序】:
#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;
}