• [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. 彻底理解kubernetes CNI

    kubernetes各版本离线安装包 CNI接口很简单,特别一些新手一定要克服恐惧心里,和我一探究竟,本文结合原理与实践,认真读下来一定会对原理理解非常透彻. 环境介绍 我们安装kubernetes时 ...

  2. 自定义仿 IPhone 开关控件

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  3. 【Java例题】1.4圆类

    4.定义一个圆类,包括半径.构造方法.计算周长方法, 计算面积方法和显示半径方法. 然后编写一个主类,在其主方法中通过定义一个圆对象来 显示圆的半径.周长和面积. package study; imp ...

  4. 转载 | SVG向下兼容优雅降级方法

    本文引自:http://www.zhangxinxu.com/wordpress/2013/09/svg-fallbacks/ 1.svg image标签降级技术 <svg width=&quo ...

  5. [实践]redhat linux5.3安装tomcat

    1.安装准备 操作系统:RedHat 5 (自带apache2.2.3) 安装tomcat前首先要安装jdk: 查看系统是否安装了jdk或tomcat的命令: rpm -qa | grep java ...

  6. Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接

    ---恢复内容开始--- 写在前面的废话:岂可修!感觉最近好忙啊,本来今天还有同学约我出去玩的.(小声bb) 正文开始:之前已经编译好的着色器中还有一些问题,比如 layout(location=0) ...

  7. 学习spark 技术

    spark sql 可以说是 spark 中的精华部分了,我感觉整体复杂度是 spark streaming 的 5 倍以上,现在 spark 官方主推 structed streaming, spa ...

  8. [Spring cloud 一步步实现广告系统] 18. 查询返回广告创意

    根据三个维度继续过滤 在上一节中我们实现了根据流量信息过滤的代码,但是我们的条件有可能是多条件一起传给我们的检索服务的,本节我们继续实现根据推广单元的三个维度条件的过滤. 在SearchImpl类中添 ...

  9. js网页倒计时功能(天,时,分,秒)

    给定任何一个时间,然后实现现在到那个时间的倒计时. 下面的例子是显示现在到2019年8月1号0时0分的倒计时: <div class="list"> <span ...

  10. cmd命令行界面运行python脚本显示的中文不正确

    在notepad++中编写了一个脚本(如图一),在cmd命令行界面中运行却发现显示的中文不正确(如图2).图3显示的是cmd界面的默认编码. 解决方案:将脚本的注释语言改为GBK,编码格式改为ANSI ...