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 ...
随机推荐
- mvc上传图片(上传和预览)webuploader
笔者看到mvc最近比较流行,而很多使用一些比较旧的的方法上传图片,再次安利一下百度的webuploader控件吧 webuploader第一步要先下载一些插件这点可以在webuploader官网上下载 ...
- MySQL 半同步重要状态参数说明
如果配置了MySQL半同步复制,可以在主库查询半同步状态,命令为: SHOW GLOBAL STATUS LIKE '%semi%'; 参数说明 Rpl_semi_sync_master_c ...
- yii学习笔记(3),自定义全局工具函数
在平时开发是经常需要打印数据来调试 常见的打印方式有print_r和var_dump,但是这样打印出来格式很乱不好浏览 在打印函数前后加上<pre></pre>就可以将内容原样 ...
- flask的查询,一对多,多对多
模型的关联: 一对多 class Role(db.Model): us = db.relationship('User',backref='role',lazy='dynamic') class Us ...
- HMM笔记
参考资料: 1.https://www.bilibili.com/video/av24132174/?p=4 2.<数学之美>-吴军 3.<统计学习方法>-李航 HMM(Hid ...
- 搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单
调试Django框架写的服务时,需要模拟客户端发送POST请求,然而浏览器只能模拟简单的GET请求(将参数写在url内),网上搜索得到了HttpRequester这一firefox插件,完美的实现了模 ...
- 北京Uber优步司机奖励政策(1月11日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Netty示例
一,服务端 ** * 测试Netty类库:服务端代码 * Created by LiuHuiChao on 2016/10/24. */ public class NettyServerTest { ...
- P1011 车站
P1011 车站 题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为 ...
- Calendar 实现日历实例
import java.text.ParseException; import java.util.Calendar; import java.util.GregorianCalendar; impo ...