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

背景 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
;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值