题目链接:http://113.240.233.2:8081/JudgeOnline/problem.php?id=1121

这个题看起来要多次使用bfs,其实只要换个思维就会发现这就是一个简单的bfs裸题。不要从P开始bfs,要从W开始bfs,然后到达P的话就将W与P间的距离加上,如果达到F的话,先存起来,最后sort一下,最远的加一次,其他的加两次(因为每点燃一次火炬台就会失去小火炬又得重新回去,所以要加两次;但是最远的那个根据距离可以判断它是最后一个火炬台,把它点燃之后就不需要再回W取小火炬了,因此只需加一次)。代码实现如下:

 #include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std; int n,m,sx,sy,ans,t,k;
char mp[][];
int vis[][],cost[]; struct node{
int x,y,step;
}nw,nxt; int dx[]={,-,,},dy[]={,,,-}; void bfs(int x,int y){
queue<node> q;
nw.x=x,nw.y=y,nw.step=;
vis[nw.y][nw.x]=;
q.push(nw);
while(!q.empty()){
nw=q.front();q.pop();
if(mp[nw.y][nw.x]=='P'){
t=nw.step;
mp[nw.y][nw.x]='.';
}
if(mp[nw.y][nw.x]=='F'){
cost[k++]=nw.step;
mp[nw.y][nw.x]='.';
}
for(int i=;i<;i++){
nxt.x=nw.x+dx[i],nxt.y=nw.y+dy[i];
if(nxt.x>= && nxt.x<m && nxt.y>= && nxt.y<n && mp[nxt.y][nxt.x]!='#' && vis[nxt.y][nxt.x]==){
nxt.step=nw.step+;
vis[nxt.y][nxt.x]=;
q.push(nxt);
}
}
}
} int main(){
while(~scanf("%d%d",&n,&m)){
if(n== && m==) break;
for(int i=;i<n;i++){
scanf("%s",mp[i]);
}
memset(vis,,sizeof(vis));
memset(cost,,sizeof(cost));
ans=,t=,k=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(mp[i][j]=='W'){
sx=j,sy=i;
break;
}
}
}
bfs(sx,sy);
sort(cost,cost+k);
for(int i=;i<k;i++){
if(i!=k-){
ans+=cost[i]*;
}
else{
ans+=cost[i];
}
}
ans+=t;
int flag=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(mp[i][j]=='F' || mp[i][j]=='P'){
flag=;
}
}
}
if(flag) printf("No\n");
else printf("%d\n",ans);
}
}
 

聂老师的考验(反向bfs)的更多相关文章

  1. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  2. HDU 1043 Eight(反向BFS+打表+康托展开)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各 ...

  3. POJ1077 Eight —— 反向BFS

    主页面:http://www.cnblogs.com/DOLFAMINGO/p/7538588.html 代码一:以数组充当队列,利用结构体中的pre追溯上一个状态在数组(队列)中的下标: #incl ...

  4. UVa 1599 理想路径(反向BFS 求最短路径 )

    题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数 ...

  5. 【HDU - 1043】Eight(反向bfs+康托展开)

    Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8   在上图中,由于右下角位置是空的 ...

  6. 康托展开+反向bfs

    康托展开+反向bfs hdu 1043 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 #include <iostream> # ...

  7. POJ3967Ideal Path[反向bfs 层次图]

    Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Descri ...

  8. 【Aizu - 0121】Seven Puzzle (反向bfs)

    -->Seven Puzzle 原文是日语 这里就直接写中文了  Descriptions: 7拼图由8个正方形的卡和这些卡片完全收纳的框构成.每张卡都编号为0, 1, 2, …, 7,以便相互 ...

  9. SCU-4527 NightMare2(Dijkstra+BFS) !!!错误题解!!!

    错解警告!!! 描述 可怜的RunningPhoton又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着 ...

随机推荐

  1. 简单理解SQL Server锁机制

    多个用户同时对数据库的并发操作时,可能会遇到下面几种情况,导致数据前后不一致: 1,A.B事务同时对同一个数据进行修改,后提交的人的修改结果会破坏先提交的(丢失更新): 2,事务A修改某一条数据还未提 ...

  2. 【.NET】- async await 异步编程

    为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中, ...

  3. phpcms黄页,不能选择行业。解决办法

    用phpcms黄页模块,发布产品的时候.不能选择 产品分类,点开之后,啥都没有,是空的. 这个是因为:js的问题. 解决办法:将 网站根目录的 js 文件中的两个文件,更换为 官方的两个js文件.即可 ...

  4. COM 自动化控制Excel应用程序

    class Program { static void Main(string[] args) { var dt = new System.Data.DataTable(); dt.Columns.A ...

  5. JavaScript 语句标识符,变量周期,常见的HTML事件

    语句 描述 break 用于跳出循环. catch 语句块,在 try 语句块执行出错时执行 catch 语句块. continue 跳过循环中的一个迭代. do ... while 执行一个语句块, ...

  6. Java调用WebService之Axis实现

    import org.apache.axis.client.Call; import org.apache.axis.client.Service; /** * @ClassName: TestAxi ...

  7. POJ3666:Making the Grade——题解

    http://poj.org/problem?id=3666 题目大意:给n个数,每次操作可使一个数+1或-1,求最小操作数使得序列不下降或不上升. —————————————————————— 思路 ...

  8. POJ3041:Asteroids——题解

    http://poj.org/problem?id=3041 题目大意:激光可以干掉一整行或一整列陨石,求最少激光次数. —————————————————— 二分图匹配,对于每一个陨石将它的横纵坐标 ...

  9. [Leetcode] word search 单词查询

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  10. CodeForces.71A Way Too Long Words (水模拟)

    CodeForces71A. Way Too Long Words (水模拟) 题意分析 题怎么说你怎么做 没有坑点 代码总览 #include <iostream> #include & ...