HDU 4308 Saving Princess claire_(简单BFS)
求出不使用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)的更多相关文章
- hdu 4308 Saving Princess claire_
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Description Princess cla ...
- hdu 4308 Saving Princess claire_ BFS
为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索 贴代码: #include <iostream> #include ...
- BFS(最短路) HDOJ 4308 Saving Princess claire_
题目传送门 题意:一个(r*c<=5000)的迷宫,起点'Y‘,终点'C',陷阱‘#’,可行路‘*’(每走一个,*cost),传送门P,问Y到C的最短路 分析:一道最短路问题,加了传送门的功能, ...
- HDU 4308 BFS Saving Princess claire_
原题直通车:HDU 4308 Saving Princess claire_ 分析: 两次BFS分别找出‘Y’.‘C’到达最近的‘P’的最小消耗.再算出‘Y’到‘C’的最小消耗,比较出最小值 代码: ...
- Saving Princess claire_(hdu 4308 bfs模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Jav ...
- 2012 #1 Saving Princess claire_
Saving Princess claire_ Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu----(4308)Saving Princess claire_(搜索)
Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu 5025 Saving Tang Monk(bfs+状态压缩)
Description <Journey to the West>(also <Monkey>) is one of the Four Great Classical Nove ...
- 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ...
随机推荐
- 关于c++随机种子srand( time(NULL) )的设置问题
设置随机种子srand( time(NULL) ) ,在程序中只需要设置一次就好,而且不能被调用多次,直接看列子. a:每次都重新设置随机种子 #include<iostream> #in ...
- tornado用户指引(四)------tornado协程使用和原理(三)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/happyAnger6/article/details/51291221几种常用的协程方式: 1.回调 ...
- js实现所有异步请求全部加载完毕后,loading效果消失
在实际开发中,一定有情况是这样的,一个页面我们有多个地方请求了ajax,在这种情况下,我们要实现数据没来之前出现我们炫酷的loading效果,而且要等到所有的ajax都请求完毕后,才让我们的loadi ...
- js 校验身份证号
根据地区编码.身份证格式.18位身份证需要验证最后一位校验位 //校验身份证 function IdentityCodeValid(code) { var city = { 11: "北京& ...
- 【Spark】Spark核心之弹性分布式数据集RDD
1. RDD概述 1.1 什么是RDD (1) RDD(Resilient Distributed Dataset)弹性分布式数据集,它是Spark的基本数据抽象,它代表一个不可变.可分区.里面的元素 ...
- Centos7.5 lnmp+mongodb扩展
安装NginxYUM源中没有Nginx,我们需要增加一个nginx的源nginx.repo # vi /etc/yum.repos.d/nginx.repo 源文件的内容 [nginx] name=n ...
- php无限级分类----封装函数
public function catetree($cateRes){//传递过来的数据资源 return $this->sort($cateRes); 调用函数 } public functi ...
- MP3 编码解码 附完整c代码
近期一直不间断学习音频处理,一直也没想着要去碰音频编解码相关. 主要是觉得没什么实际的作用和意义. 不管视频编解码,图像编解码,音频编解码,都有很多组织基金在推动. 当然,在一些特定的情景下,需要用起 ...
- title中添加小图标
<title>标签中不能添加图片,但是可以添加小图标. 步骤: 1.做一个16 X 16像素的ico格式的图标.具体操作方法是,先在Photoshop中做一个透明背景的16 X 16像素P ...
- go内建容器-字符和字符串操作
1.基础定义 在基础语法篇提到过golang的rune相当于其他编程语言的char,其本质是一个int32(四字节),用[]rune来转换一个字符串时,得到的是个解码后的结果,存储在新开辟的[]run ...