【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 105107
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

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


 

posted on 2009-08-29 09:45 开拓者 阅读(297) 评论(0)  编辑 收藏 引用 所属分类: 算法&例题Vijos OJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理