求出不使用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. kafka topic制定规则

    kafka topic的制定,我们要考虑的问题有很多,比如生产环境中用几备份.partition数目多少合适.用几台机器支撑数据量,这些方面如何去考量?笔者根据实际的维护经验,写一些思考,希望大家指正 ...

  2. YouCompleteMe

    需要配套的.vimrc :sw:.h与.cpp切换 Issue:YouCompleteMe unavailable no module named future cd .vim/Vundle/YouC ...

  3. thinkphp5 toArray()报错

    //DB操作返回是数组.模型直接操作返回是对象 //对象类型转换数组 //打开 database.php 增加或修改参数 'resultset_type' => '\think\Collecti ...

  4. spark成长之路(1)spark究竟是什么?

    今年6月毕业,来到公司前前后后各种事情折腾下来,8月中旬才入职.本以为终于可以静下心来研究技术了,但是又把我分配到了一个几乎不做技术的解决方案部门,导致现在写代码的时间都几乎没有了,所以只能在每天下班 ...

  5. 20190129-‘abcdefgh’里面挑出3个字母进行组合,一共有多少组合

    一. 百度面试题‘abcdefgh’里面挑出3个字母进行组合,一共有多少组合,要求3个字母中不能有重复的组合,三个字母同时出现的次数只能出现一次,如出现了abc就不能出现cab,bca等 思路: 1. ...

  6. python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说

    使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<undersco ...

  7. 安装使用supervisor来启动服务

    supervisor 使用方法 supervisor(官网)是一个unix的系统进程管理软件,可以用它来管理apache.nginx等服务, 若服务挂了可以让它们自动重启.当然也可以用来实现golan ...

  8. Emgucv安装及使用

    Emgucv安装 最近有个客户联系我,希望我能够为他们做一个识别瓷砖花纹的软件.应用场景是这样的:现场会有一个摄像头去拍摄流水线上运输的瓷砖,如果检测这块瓷砖的花纹不符合要求,则需要给PLC或输出板卡 ...

  9. 封装axios方法之一

    一.先来说说为什么要封装axios异步请求. 我们前端开发中总是会遇到跨域的问题,我们会配置proxy来解决跨域的问题,无论是vue 还是react. 如何配置我这里就不说了. 然后...然后我们就会 ...

  10. 机房人民大团结(DP)

    最近,机房出了一个不团结分子:Dr.Weissman.他经常欺骗同学们吃一种“教授糖豆”,使同学们神志不清,殴打他人,砸烂计算机,破坏机房团结.幸运地,一个和谐家认清了Dr.Weissman的本质.机 ...