• [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
  • 提示
  • 来源
  • 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛

感觉这一套湖南省赛题目出的奇奇怪怪的 体验极差 好多数据类型范围什么的都要靠自己猜

还有这一题的输入也是奇奇怪怪的

emmmm搜索都不会写了 尴尬 最短路练完去练搜索好了

处理输入时候用到的一个函数 atoi 把字符串转换为整型的数

bfs 用优先队列维护 但是要改变一下排序

搜索关键要记得标记

虽然题目上说可以走回来?但是显然走回头路肯定不是正确答案

至于第二种什么有趣问题要转弯的话 就需要标记一下这个点这个方向 总之就是不能完全一样的状态重复

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#define inf 0x3f3f3f3fusing namespace std;int n, m, r1, c1, r2, c2;
int graph[505][505];
bool vis1[505][505], vis2[505][505][4];
int movi[4] = {-1, 0, 1, 0}, movj[4] = {0, 1, 0, -1};
struct node{int x, y, sum;int dir;bool friend operator < (node a, node b){return a.sum > b.sum;}
};bool ok(int x, int y)
{if(x < 1 || x > n || y < 1 || y > m)return false;return graph[x][y] != 0;
}int bfs1()
{priority_queue<node> q;node now, nextt;now.x = r1;now.y = c1;now.sum = graph[r1][c1];q.push(now);memset(vis1, false, sizeof(vis1));vis1[r1][c1] = true;while(!q.empty()){now = q.top();q.pop();if(now.x == r2 && now.y == c2){return now.sum;}for(int i = 0; i < 4; i++){nextt.x = now.x + movi[i];nextt.y = now.y + movj[i];if(ok(nextt.x, nextt.y) && !vis1[nextt.x][nextt.y]){vis1[nextt.x][nextt.y] = true;nextt.sum = now.sum + graph[nextt.x][nextt.y];q.push(nextt);}}}return -1;
}int bfs2()
{priority_queue<node>q;node now, nextt;now.x = r1;now.y = c1;now.sum = graph[r1][c1];now.dir = -1;q.push(now);memset(vis2, false, sizeof(vis2));vis2[r1][c1][0] = true;vis2[r1][c1][1] = true;vis2[r1][c1][2] = true;vis2[r1][c1][3] = true;while(!q.empty()){now = q.top();q.pop();if(now.x == r2 && now.y == c2){return now.sum;}for(int i = 0; i < 4; i++){nextt.x = now.x + movi[i];nextt.y = now.y + movj[i];if(now.dir == i)continue;if(ok(nextt.x, nextt.y) && !vis2[nextt.x][nextt.y][i]){vis2[nextt.x][nextt.y][i] = true;nextt.sum = now.sum + graph[nextt.x][nextt.y];nextt.dir = i;q.push(nextt);}}}return -1;
}int main()
{int cas = 1;while(cin>>n>>m>>r1>>c1>>r2>>c2){char ch[10];for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){scanf("%s", ch);if(!strcmp(ch, "*"))graph[i][j] = 0;elsegraph[i][j] = atoi(ch);/*cin>>graph[i][j];if(cin.fail()){graph[i][j] = 0;cin.clear();}getchar();*/}}printf("Case %d: ", cas++);cout<< bfs1()<<" ";cout<<bfs2()<<endl;//getchar();}return 0;
}

emmm看到还能用dijkstra写的 其实不就是bfs嘛

不知道为什么都没有人用dfs写的

转载于:https://www.cnblogs.com/wyboooo/p/9643428.html

简单的图论问题【湖南省赛】相关推荐

  1. 20220104[动态规划 图论 建模][衢州市赛2017]环游衢州

    20220104[动态规划 图论 建模][衢州市赛2017]环游衢州 题目描述 Jason 想要带着他新叫的朋友环游 QZ,于是他把 QZ 划分成了 n 个地方,已知这 n 个地方由 m 条双向边相连 ...

  2. 2022年“网络安全”赛项湖南省赛选拔赛 任务书

    2022年"网络安全"赛项湖南省赛选拔赛 任务书 2022年"网络安全"赛项湖南省赛选拔赛 任务书 A模块基础设施设置/安全加固(200分) B模块安全事件响应 ...

  3. 2015湖南省赛 CSU 1783 :聊天止于呵呵(模拟)

    1783: 聊天止于呵呵 Submit Page      Summary      Time Limit: 5 Sec       Memory Limit: 128 Mb       Submit ...

  4. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,-,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  5. csuoj 2000 Tian Ji's Horse Race Again 2017湖南省赛

    完了,这场先WA一发 A,再WA B,然后发现问题后又WA一发A...心态爆炸,不然这题早过了,而且也能写完I了. Last time, the king of the country Qi lost ...

  6. Timo's mushrooms CSU - 1991 (第十三届湖南省赛热身赛题)

    题目链接:点击打开链接 题目大意:提莫埋了很多蘑菇,有些蘑菇之间有一条有向边,u->v,若u爆炸则v爆炸,而且每个蘑菇只能引起与之相连的一个蘑菇的爆炸(当时题目意思读错,以为是求单向联通分量,然 ...

  7. BUUCTF:[湖南省赛2019]Findme

    题目地址:https://buuoj.cn/challenges#[%E6%B9%96%E5%8D%97%E7%9C%81%E8%B5%9B2019]Findme 压缩包里有五张图,依次来看 1.pn ...

  8. 2022-2023赛季高职大数据竞赛-赛规任务剖析

    2023年高职大数据省赛,任务详解与参考实现. 2022-2023赛季高职大数据竞赛-赛规说明 2022-2023赛季高职大数据竞赛-赛规任务剖析 2022-2023赛季高职大数据竞赛(样题解析)-离 ...

  9. 【非技术贴】记湖南省第九届程序设计大赛

    昨天诸事不顺,看来还是可以攒点人品. 先说说比赛过程吧(这个比较有价值但很容易忘记) 继续昨天的诸事不顺,进了考场,显示器跟键盘侧位一尺多,叫我怎么敲代码!?更可恶的,我们队的信封呢??找了半天隔壁队 ...

最新文章

  1. Pascal 错误代码及含义
  2. 扩增子分析流程1. QIIME虚拟机安装配置及挂载外部目录
  3. 深入理解JVM虚拟机(四):Class类文件结构(二)
  4. pythonhtml内容比较_Python使用difflib模块比较两个文件内容异同,同时输出html易浏览...
  5. 修改树莓派更新源及设置代理配置
  6. ITK:应用Atan图像过滤器
  7. how is SAP ui5 shell view implemented
  8. mysqlbinlog工具_mysqlbinlog命令详解 Part 1-实验环境准备
  9. mvvm 耗时加载进度条_ZK的实际应用:MVVM –加载和渲染数据
  10. mvc的Controller返回值类型ActionResult详解
  11. PHP 正则表达式分割 preg_split 与 split 函数
  12. 域服务器如何修改域名,新网域名如何修改DNS设置方法
  13. bootstrap栅栏系统 解决当弹窗口变小的时候变成1列问题
  14. 英语总结系列(十八):六月一波三折的英语
  15. linux 软件源码安装教程,linux源码安装软件步骤
  16. 计算机中丢失mplugin.dll,安装MathType时提示缺少Mplugin.dll文件
  17. 用HTML5制作简单的个人简历
  18. 小刘同学的第五十五篇博文
  19. 搜狗输入法linux版 rpm,wps for linux 不能使用搜狗输入法
  20. 交换游戏(记忆化搜索,状态压缩,位运算)

热门文章

  1. 安卓蓝牙键盘切换输入法_超薄无线蓝牙双模罗技K580键盘,自由切换享受打字快乐...
  2. 华为大佬:做一个快乐的程序员,而不是码农
  3. 热电偶校验仪_热电偶校验方法_南昌手持热工校验仪,杭州全功能热工过程校验仪厂家...
  4. 隐藏窗口 java swing_Java简单实现贪吃蛇经典小游戏(附源代码)
  5. java程序实验报告_实验报告一
  6. flowlayout布局怎么换行_web前端学习怎么入门
  7. Servlet之第一个web项目
  8. 递增三元组(蓝桥杯)
  9. SCAN: Structure Correcting Adversarial Network for Organ Segmentation in Chest X-rays(译)
  10. opencv3.4.1 + vs 2017 + cmake 3.11.3 + win10 配置. 终章