求出不使用P点时起点到终点的最短距离,求出起点到所有P点的最短距离,求出终点到所有P点的最短距离。

答案=min( 不使用P点时起点到终点的最短距离, 起点到P的最短距离+终点到P的最短距离 )

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue> using namespace std; const int MAXN = ;
const int INF = << ; const int dx[] = { -, , , };
const int dy[] = { , -, , }; struct node
{
int x, y;
int cost;
int id;
bool operator<( const node &rhs ) const
{
return cost < rhs.cost;
}
}; int R, C, cost;
char mat[MAXN][MAXN];
bool vis[MAXN][MAXN];
int index[MAXN][MAXN];
int G[][MAXN/];
node P[MAXN/], start, end;
int cntP; void init( )
{
cntP = ;
for ( int i = ; i < R; ++i )
for ( int j = ; j < C; ++j )
{
if ( mat[i][j] == 'P' )
{
P[cntP].x = i;
P[cntP].y = j;
P[cntP].cost = ;
P[cntP].id = cntP;
//printf( "cntP=%d [%d, %d]\n", cntP, i, j );
++cntP;
}
else if ( mat[i][j] == 'Y' )
{
start.x = i;
start.y = j;
start.cost = ;
}
else if ( mat[i][j] == 'C' )
{
end.x = i;
end.y = j;
end.cost = ;
}
} P[] = start;
P[].id = ; P[cntP] = end;
P[cntP].id = cntP;
//printf( "cntP = %d\n", cntP );
for ( int i = ; i <= cntP; ++i )
index[ P[i].x ][ P[i].y ] = i;
return;
} bool check( int x, int y )
{
if ( x >= && x < R && y >= && y < C ) return true;
return false;
} int BFS( int c, node st )
{
for ( int i = ; i < R; ++i )
for ( int j = ; j < C; ++j )
vis[i][j] = false; queue<node> Q; st.cost = ;
vis[ st.x ][ st.y ] = true;
Q.push(st); while ( !Q.empty() )
{
node cur = Q.front();
Q.pop(); for ( int i = ; i < ; ++i )
{
int xx = cur.x + dx[i];
int yy = cur.y + dy[i];
if ( check( xx, yy ) && mat[xx][yy] != '#' && !vis[xx][yy] )
{
node next;
next.x = xx;
next.y = yy;
next.cost = cur.cost;
next.id = index[xx][yy];
if ( mat[xx][yy] != '*' )
{
int id = index[xx][yy];
G[c][id] = next.cost;
}
else
next.cost += cost; vis[xx][yy] = true;
Q.push(next);
}
}
}
return INF;
} int getG()
{
//printf("***cntP=%d\n", cntP);
for ( int i = ; i <= cntP; ++i )
{
G[][i] = INF;
G[][i] = INF;
} BFS( , P[] );
BFS( , P[cntP] ); int ans = G[][cntP];
//printf("***ans=%d\n", ans ); for ( int i = ; i < cntP; ++i )
for ( int j = ; j < cntP; ++j )
{
if ( G[][i] < INF && G[][j] < INF )
ans = min( ans, G[][i] + G[][j] );
//printf( "ans = %d\n", ans );
} return ans;
} int main()
{
while ( scanf( "%d%d%d", &R, &C, &cost ) == )
{
for ( int i = ; i < R; ++i )
scanf( "%s", mat[i] ); init();
int ans = getG(); if ( ans < INF ) printf( "%d\n", ans );
else puts("Damn teoy!");
}
return ;
}

HDU 4308 Saving Princess claire_(简单BFS)的更多相关文章

  1. hdu 4308 Saving Princess claire_

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Description Princess cla ...

  2. hdu 4308 Saving Princess claire_ BFS

    为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索 贴代码: #include <iostream> #include ...

  3. BFS(最短路) HDOJ 4308 Saving Princess claire_

    题目传送门 题意:一个(r*c<=5000)的迷宫,起点'Y‘,终点'C',陷阱‘#’,可行路‘*’(每走一个,*cost),传送门P,问Y到C的最短路 分析:一道最短路问题,加了传送门的功能, ...

  4. HDU 4308 BFS Saving Princess claire_

    原题直通车:HDU 4308 Saving Princess claire_ 分析: 两次BFS分别找出‘Y’.‘C’到达最近的‘P’的最小消耗.再算出‘Y’到‘C’的最小消耗,比较出最小值 代码: ...

  5. Saving Princess claire_(hdu 4308 bfs模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Jav ...

  6. 2012 #1 Saving Princess claire_

    Saving Princess claire_ Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  7. hdu----(4308)Saving Princess claire_(搜索)

    Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. hdu 5025 Saving Tang Monk(bfs+状态压缩)

    Description <Journey to the West>(also <Monkey>) is one of the Four Great Classical Nove ...

  9. 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

    /* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ...

随机推荐

  1. 【2017年最新】 iOS面试题及答案

    设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情. 1). MVC模式:Model View Control,把模型 视图 控制器 ...

  2. CentOS中的 yum upgrade 和 yum update 的区别

    通过 man yum 的帮助信息了解 yum update 和 yum upgrade: update If run without any packages, update will update ...

  3. 纯JS实现轮播图特效——详解

    <div id="slider"> <div id="sliderImgs"> <img src="img/mi04.j ...

  4. 创建jq插件步骤

    无意看了这篇<jQuery插件开发精品教程,让你的jQuery提升一个台阶>文章,现在做一下总结. 一.jQuery插件的创建可以有三种方法 1.通过$.extend()来扩展jQuery ...

  5. 【设计模式】Java之单例设计模式

    1.单例设计模式:一个类只能有一个对象 1.1 创建单例类的步骤: 1.将构造方法私有化 2.创建私有的静态成员变量 3.共有的静态成员方法,提供当前的唯一对象 1.1 创建单例的两种方式: 1.饿汉 ...

  6. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号

    由于经常要写导单和数据分析功能,所以要获取什么时间的数据,想什么当天,周,年,月之类的时间格式都很好获取.我今天在这里为大家提供的是当月每天的开始和结束的时间格式. 希望能帮到大家!!! # 获取当月 ...

  7. QWT编译与配置-Windows/Linux环境

    QWT编译与配置-Windows/Linux环境 QWT和FFTW两种开源组件是常用的工程软件支持组件,QWT可以提供丰富的绘图组件功能,FFTW是优秀数字波形分析软件.本文使用基于LGPL版权协议的 ...

  8. django路由基本使用-6

    路由定义位置 django的路由是定义在 urls.py 文件下的 urlpatterns 列表中的. urls.py 文件是路由解析的入口. from django.conf.urls import ...

  9. fiddler响应报文的headers属性详解

    fiddler响应报文的headers属性详解 (1)Cache头域 1. Cache-Control 在请求报文已经说过了,用于设置缓存的属性,浏览内容不被缓存. 2. Data 生成消息的具体时间 ...

  10. mysql库地址

    https://dev.mysql.com/downloads/connector/