• [E] 简单的图论问题?

  • 时间限制: 5000 ms 内存限制: 65535 K
  • 问题描述
  • 给一个 n 行 m 列的迷宫,每个格子要么是障碍物要么是空地。每个空地里都有一个权值。你的 任务是从找一条(r1,c1)到(r2,c2)的路径,使得经过的空地的权值之和最小。每一步可以往上下 左右四个方向之一移动一格,但不能斜着移动,也不能移动到迷宫外面或者进入障碍物格子。

    如下图,灰色格子代表障碍物。路径 A->B->D->F->E 的权值为 10+3+6+14+8=41,它是从 A 到 E 的最优路径。注意,如果同一个格子被经过两次,则权值也要加两次。

    为了让题目更有趣(顺便增加一下难度),你还需要回答另外一个问题:如果你每次必须转弯 (左转、右转或者后退,只要不是沿着上次的方向继续走即可),最小权值是多少?比如,在 上图中,如果你刚刚从 A 走到 B,那么下一步你可以走到 D 或者 A,但不能走到 G。在上图 中,A 到 E 的最优路径是 A->B->D->H->D->F->E,权和为 10+3+6+2+6+14+8=49。注意,D 经 过了两次。

  • 输入
  • 输入包含不超过 10 组数据。每组数据第一行包含 6 个整数 n, m, r1, c1, r2, c2 (2<=n,m<=500, 1<=r1,r2<=n, 1<=c1,c2<=m). 接下来的 n 行每行包含 m 个格子的描述。每个格子要么是一个 1~100 的整数,要么是星号"*"(表示障碍物)。起点和终点保证不是障碍物。
  • 输出
  • 对于每组数据,输出两个整数。第一个整数是“正常问题”的答案,第二个整数是“有趣问 题”的答案。如果每个问题的答案是“无解”,对应的答案应输出-1。
  • 样例输入
  • 4 4 1 2 3 2
    7 10 3 9

    * 45 6 2

    * 8 14 *
    
21 1 * *
    2 4 1 1 1 4
    1 2 3 4
    9 * * 9
    2 4 1 1 1 4
    1 * 3 4
    9 9 * 9
  • 样例输出
  • Case 1: 41 49
    Case 2: 10 -1
    Case 3: -1 -1
  • 提示
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
#define maxn 510
int n,m,xs,ys,xe,ye;
int dx[]={,-,,},dy[]={,,,-};
int mapn[maxn][maxn];
int vis[maxn][maxn],vis2[maxn][maxn][];
struct node{
int x,y,step,dir;
friend bool operator<(node a, node b) {return a.step>b.step;}
};
int bfs(){
node p;
p.x = xs,p.y = ys,p.step = mapn[xs][ys];
priority_queue<node> q;
q.push(p);
vis[xs][ys] = ;
while(!q.empty()){
node now = q.top();
q.pop();
for(int i=;i<;i++){
int xx = now.x + dx[i];
int yy = now.y + dy[i];
if(xx>=&&xx<n&&yy>=&&yy<m&&
mapn[xx][yy]!=-&&!vis[xx][yy]){
vis[xx][yy] = ;
node tmp;
tmp.x = xx;
tmp.y = yy;
tmp.step = now.step + mapn[xx][yy];
if(now.x == xe && now.y == ye){
cout << now.step << " ";
return ;
}
q.push(tmp);
}
}
}
return ;
}
int bfs2(){//有趣的情况
node p;
p.x = xs,p.y = ys,p.step = mapn[xs][ys],p.dir=-;
priority_queue<node> q;
q.push(p);
while(!q.empty()){
node now = q.top();
q.pop();
for(int i=;i<;i++){
int xx = now.x + dx[i];
int yy = now.y + dy[i];
if(xx>=&&xx<n&&yy>=&&yy<m&&now.dir!=i&&
mapn[xx][yy]!=-&&!vis2[xx][yy][i]){
vis2[xx][yy][i] = ;//vis2为三维数组,多存了一个方向
node tmp;
tmp.x = xx;
tmp.y = yy;
tmp.step = now.step + mapn[xx][yy];
tmp.dir = i;//dir为当前方向
if(now.x == xe && now.y == ye){
cout << now.step << endl;
return ;
}
q.push(tmp);
}
}
}
return ;
}
int main()
{
char ch[];
int num,t=;
while(cin >> n >> m >> xs >> ys >> xe >> ye){
t++;
memset(vis2,,sizeof(vis2));
memset(vis,,sizeof(vis));
xs--,ys--,xe--,ye--;
getchar();
for(int i=;i<n;i++){
int l = ;
gets(ch);
int len = strlen(ch);
for(int j=;j<len;j++){
//注意这种同时处理字符和数字的情况,这里数字从题目那里知道是小于或等于三位数
if(ch[j] == '*'){
mapn[i][l] = -;
l++;
}
else if(ch[j]>=''&&ch[j]<=''){
num = ch[j]-'';
if(ch[j+]>=''&&ch[j+]<=''){
num = num*+(ch[j+]-'');
j++;
if(ch[j+]>=''&&ch[j+]<=''){
num = num*+(ch[j+]-'');
j++;
}
}
mapn[i][l]=num;
l++;
}
}
}
printf("Case %d: ",t);
if(bfs() == ){
cout << "-1 ";
}
if(bfs2() == ){
cout << "-1" << endl;
}
}
return ;
}

2015 省赛 简单的图论问题? bfs的更多相关文章

  1. NOJ——1642简单的图论问题?(BFS+优先队列)

    [1642] 简单的图论问题? 时间限制: 5000 ms 内存限制: 65535 K 问题描述 给一个 n 行 m 列的迷宫,每个格子要么是障碍物要么是空地.每个空地里都有一个权值.你的 任务是从找 ...

  2. NYOJ--1276--机器设备(河南省第九届省赛,简单的bfs)

    机器设备 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Alpha 公司设计出一种节能的机器设备.它的内部结构是由 N 个齿轮组成.整个机器设备有 一个驱动齿轮,当 ...

  3. 浙江大学2015年校赛F题 ZOJ 3865 Superbot BFS 搜索

    不知道为什么比赛的时候一直想着用DFS 来写 一直想剪枝结果还是TLE = = 这题数据量不大,又是问最优解,那么一般来说是用 BFS 来写 int commandi[4] = {1, 2, 3, 4 ...

  4. hdu 5455 (2015沈阳网赛 简单题) Fang Fang

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5455 题意就是找出所给字符串有多少个满足题目所给条件的子串,重复的也算,坑点是如果有c,f以外的字符也是不 ...

  5. hdu 5461(2015沈阳网赛 简单暴力) Largest Point

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5461 题意就是在数组中找出a*t[i]*t[i]+b*t[j]的最大值,特别注意的是这里i和i不能相等,想 ...

  6. NOI 2015 滞后赛解题报告

    报同步赛的时候出了些意外.于是仅仅能做一做"滞后赛"了2333 DAY1 T1离线+离散化搞,对于相等的部分直接并查集,不等部分查看是否在同一并查集中就可以,code: #incl ...

  7. 【NOI P模拟赛】寻找道路(bfs,最短路)

    题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...

  8. Sicily 1150: 简单魔板(BFS)

    此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...

  9. 2015安徽省赛 D.锐雯上单不给就送

    题目描述 <英雄联盟>(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游.<英雄联盟>除了即时战略.团队作战外,还拥有特色的英雄.自动匹配的战网平台,包 ...

随机推荐

  1. 放出一批jsp图书管理系统图书借阅系统源码代码运行

    基于jsp+mysql的JSP图书销售管理系统 https://www.icodedock.com/article/105.html基于jsp+Spring+Spring MVC的Spring图书借阅 ...

  2. word 文档导出 (freemaker+jacob)--java开发

    工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶 ...

  3. Apache NiFi 核心概念和关键特性

    本文来源于官方文档翻译 NiFi 的核心概念 NiFi 最早是美国国家安全局内部使用的工具,用来投递海量的传感器数据.后来由 apache 基金会开源.天生就具备强大的基因.NiFi基本设计理念与 F ...

  4. main方法中注入Spring bean

    在有些情况下需要使用main使用Spring bean,但是main方法启动并没有托管给Spring管理,会导致bean失败,报空指针异常. 可以使用 ClassPathXmlApplicationC ...

  5. java学习-NIO(二)Buffer

    当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel 中, 并且从 Channel 中写入到 Buffer 中.缓 ...

  6. koa2图片上传成功后返回服务器地址,实时显示服务器图片

    版本:node(8.5.0); koa(2.4.1); koa-router(7.3.0); koa-body(2.5.0); koa-static(4.0.2); 代码实现 const fs = r ...

  7. sql存储过程中循环批量插入

    前几天有一个需求很头痛,部门是有上下级关系的,在给部门的经理赋予角色和权限的时候,通常我们都会认为假如经理A的部门是1,那么我给了他部门1 的管理权限,那么1的下级部门101,102,103 &quo ...

  8. 送礼物「JSOI 2015」RMQ+01分数规划

    [题目描述] 礼品店一共有N件礼物排成一列,每件礼物都有它的美观度.排在第\(i(1\leq i\leq N)\)个位置的礼物美观度为正整数\(A_I\).JYY决定选出其中连续的一段,即编号为礼物\ ...

  9. 从输入URL到浏览器显示页面发生了哪些事情---个人理解

    经典面试题:从输入URL到页面显示发生了哪些事情 以前一直都记不住,这次自己理解了一下 用自己的话总结了一次,不对的地方希望大佬给我指出来 1.主机通过DHCP协议获取客户端的IP地址.子网掩码和DN ...

  10. 云片RocketMQ实战:Stargate的前世今生

    RocketMQ消息队列,专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性,是应对企业业务峰值时刻必备的技术. 云片由于 ...