• [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. .c和.h文件的区别

    .h文件(头文件): 一般写一些函数声明.宏定义.结构体等内容. 其实就是将各个.c文件中重复的声明.宏定义.结构体,枚举变量等提取出来,放进一个新的文件中,便于其他.c文件共享这部分的代码,同时也方 ...

  2. thinkphp3.2集成极光推送

    项目中用到了给客户端的推送功能,选用了极光推送,下面演示一下在thinkphp中集成极光推送 1.下载极光推送的php类,可以从笔者的git下载 地址:https://git.oschina.net/ ...

  3. Golang高效实践之array、slice、map

    前言 Golang的slice类型为连续同类型数据提供了一个方便并且高效的实现方式.slice的实现是基于array,slice和map一样是类似于指针语义,传递slice和map并不涉及底层数据结构 ...

  4. 建立第一个G2图表

    Step1:引进G2脚本 方法一:引入在线脚本 <script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist ...

  5. ImageLoader_显示图片

    public class MainActivity extends AppCompatActivity { private ListView lv; private List<Bean.Resu ...

  6. 解决树莓派烧录系统后没有boot文件,只出现盘符问题

    首先,如果下图情况,说明你没有烧录好,继续向下看 放一张安装成功的图片 出现这个的原因是因为前期没有烧录好,它会回滚到img文件中,如果中途退出,它会写入到img文件中 正确文件大小(Raspbian ...

  7. springboot自动配置源码解析

    springboot版本:2.1.6.RELEASE SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfig ...

  8. python+unittest框架第二天unittest之简单认识Test Suite:测试套件

    今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...

  9. 多线程编程-synchronized

    使用取钱的demo来模拟实现线程的同步 package com.iotec.synchronizedTest; import java.io.ObjectInputStream; public cla ...

  10. app登录接口请求报:“签名验证失败”???已解决

    根据抓包数据获得url.param.header,在charles中compose请求结果为成功,在pycharm中运行则报:“签名验证失败”. 运行结果: