求出不使用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. 463. Island Perimeter (5月29日)

    解答 class Solution { public: int islandPerimeter(vector<vector<int>>& grid) { int num ...

  2. PHP环境配置:Windows7+IIS7+PHP+MySQL - 适用于(2008 R2 / 8 / 10)

    配置需求 操作系统:Windows7(x32/x64), windows2008 IIS版本:7.0 PHP版本:7.0.6 及以上 MySQL版本:5.7.12 及以上 第一步:安装 IIS 注意: ...

  3. vuejs 预渲染插件 prerender-spa-plugin 生成多页面 -- SEO

    前端vue等框架打包的项目一般为SPA应用,而单页面是不利于SEO的,现在的解决方案有两种: 1.SSR服务器渲染   了解服务器渲染请进,这里不做记录. 2.预渲染模式   这比服务端渲染要简单很多 ...

  4. 壹度DIY_微信小程序组件_小程序插件开发

    开源免费插件,diy特有的页面机制,搭配30+自定义组件,让你的站点每一个页面都可以完全自定义,可无缝对接任意小程序,如有疑问加入qq壹度小程序交流群:302866773:或wx:liu2417301 ...

  5. 『Python基础-7』for循环 & while循环

    『Python基础-7』for循环 & while循环 目录: 循环语句 for循环 while循环 循环的控制语句: break,continue,pass for...else 和 whi ...

  6. 解决应用程序无法正常启动0xc0150002等问题

    1.在程序运行出错的时候,右键“我的电脑”,然后点击“管理”→“事件查看器”→“Windows 日志”→“应用程序”,查看错误信息: 1> “E:\IPCam_share\ARP\數據處理\Hg ...

  7. 成都Uber优步司机奖励政策(1月9日)

    1月9日 奖励政策 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblog ...

  8. 苏州Uber人民优步奖励政策

    人民优步(People's Uber)资费标准 起步价(Base Fare):¥0.00 每公里(Per KM):¥1.65 每分钟(Per Min):¥0.30 最低价(Min Fare):¥9.0 ...

  9. Entity Framework Core 导航属性 加载数据

    Loading Related Data https://docs.microsoft.com/en-us/ef/core/querying/related-data Eager loading me ...

  10. SpringBoot-03:SpringBoot+Idea热部署

      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 所谓热部署,就是在项目启动中,修改class类中做的修改操作,无需重新启动项目,就可以变更,在网页展示中有 ...