题目:http://codevs.cn/problem/1024/
思路:根据数据建立燕园路口连接矩阵,然后用floyd算法求解最有路径。题目,数据5有误,t与k数据颠倒即可得到答案92。
题解:

/* 1024 一塔湖图 */
#include <stdio.h>#define DEBUG#define MAXN 11             /* 最大面积 */
#define MAXT 101            /* 最多道路 */
#define MAXTIME 1000000     /* 最长时间 */#define IMPOS -1            /* 无法通行标志 *//* 方向定义 */
#define NORTH 0
#define SOUTH 1
#define WEST  2
#define EAST  3/* 方向相对坐标 */
int posx[4]={0,0,-1,1};
int posy[4]={-1,1,0,0};/* 湖泊结构体,边界(x1,y1), (x2,y2) */
struct _lake{int x1, y1, x2, y2;
}lake[MAXN];
/* 无法通行道路结构体 */
struct _traffic{int x1, y1;int x2, y2;
}traffic[MAXT];
/* 十字路口结构体 */
typedef struct _crossing{int x;int y;
}crossing; int n, m, t, k;                     /* 燕园尺寸n*m,无法通行道路数t,湖数k */
int an[MAXN], bm[MAXN];             /* 纵,横通行时间 */
crossing a, b;                      /* 起点位置,图书馆位置 */
int roads[MAXN][MAXN][MAXN][MAXN];  /* 燕园道路图 */ crossing queue[MAXT];   /* floyd操作队列 */
int inq[MAXN][MAXN];    /* 是否已存在于待操作队列标记 */
int dis[MAXN][MAXN];    /* 最优距离表 */ /* 绘制道路 */
void draw_roads(){int x1, y1, x2, y2;int i;/* 南北道路通过时间 */ for(x1 = 1; x1 <= n; x1++){x2 = x1;for(y1 = 1; y1 < m ; y1++){y2 = y1 + 1;roads[x1][y1][x2][y2] = bm[y2] - bm[y1];roads[x2][y2][x1][y1] = bm[y2] - bm[y1];}}/* 东西道路通过时间 */for(y1 = 1; y1 <= m; y1++){y2 = y1;for(x1 = 1; x1 <= n; x1++){x2 = x1 + 1;roads[x1][y1][x2][y2] = an[x2] - an[x1];roads[x2][y2][x1][y1] = an[x2] - an[x1];}} /* 导入无法通行道路 */for(i = 1; i <= t; i++){x1 = traffic[i].x1;x2 = traffic[i].x2;y1 = traffic[i].y1;y2 = traffic[i].y2;roads[x1][y1][x2][y2] = IMPOS;roads[x2][y2][x1][y1] = IMPOS;} /* 导入湖泊数据 */for(i = 1; i <= k; i++){/* 从北到南,修改无法通行道路 */ for(y1 = lake[i].y1 + 1; y1 < lake[i].y2; y1++){for(x1 = lake[i].x1; x1 < lake[i].x2; x1++){x2 = x1 + 1;roads[x1][y1][x2][y1] = IMPOS;roads[x2][y1][x1][y1] = IMPOS;}}/* 从西到东,修改无法通行道路 */for(x1 = lake[i].x1 + 1; x1 < lake[i].x2; x1++){for(y1 = lake[i].y1; y1 < lake[i].y2; y1++){y2 = y1 + 1;roads[x1][y1][x1][y2] = IMPOS;roads[x1][y2][x1][y1] = IMPOS;}} }
}
/* 移动当前位置,并返回通过时间 */
int move_next(int x, int y, int dir){switch(dir){case NORTH:if(y - 1 > 0){return roads[x][y][x][y - 1];}return IMPOS;case SOUTH:if(y + 1 <= m){return roads[x][y][x][y + 1];}return IMPOS;case WEST:if(x - 1 > 0){return roads[x][y][x - 1][y];}return IMPOS;case EAST:if(x + 1 <= n){return roads[x][y][x + 1][y]; }return IMPOS;default:return IMPOS;}
}/* floyd 求解最优路径 */
void floyd(){int t, w;crossing now, to;int dir;int nt; /* 初始化距离 */int x, y;for(x = 1; x <= n; x++){for(y = 1; y <= m; y++){dis[x][y] = MAXTIME;inq[x][y] = 0;}} /* 将第一个点入队列 */queue[0] = a;inq[a.x][a.y] = 1;dis[a.x][a.y] = 0;t = 0;w = 1;while(t < w){now = queue[t];t++;/* 检测当前点的邻接点 */for(dir = 0; dir < 4; dir++){if(IMPOS != (nt = move_next(now.x, now.y, dir))){to.x = now.x + posx[dir];to.y = now.y + posy[dir];if(nt + dis[now.x][now.y] < dis[to.x][to.y]){dis[to.x][to.y] = nt + dis[now.x][now.y];if(0 == inq[to.x][to.y]){queue[w] = to;w++;}}}}inq[now.x][now.y] = 0;   }
} /* 主函数入口 */
int main(int argc, char *argv[]) {int x1, y1, x2, y2;     /* 索引值 */ int i;
#ifdef DEBUG     FILE *fp;if(NULL == (fp = fopen("data.txt", "r"))){return 1;}
#endif/* 获取尺寸,无法通行道路和湖泊数 */
#ifdef DEBUG    fscanf(fp, "%d %d %d %d", &n, &m, &t, &k);
#elsescanf("%d %d %d %d", &n, &m, &t, &k);
#endif /* 横向通行时间 */for(i = 1; i <= n; i++){
#ifdef DEBUG fscanf(fp, "%d", &an[i]);
#elsescanf("%d", &an[i]);
#endif} /* 纵向通行时间 */for(i = 1; i <= m; i++){
#ifdef DEBUG fscanf(fp, "%d", &bm[i]);
#elsescanf("%d", &bm[i]);
#endif} /* 获取湖泊边界 */for(i = 1; i <= k; i++){
#ifdef DEBUG fscanf(fp, "%d %d %d %d", &lake[i].x1, &lake[i].x2, &lake[i].y1, &lake[i].y2);
#elsescanf("%d %d %d %d", &lake[i].x1, &lake[i].x2, &lake[i].y1, &lake[i].y2);
#endif} /* 获取无法通行道路 */for(i = 1; i <= t; i++){
#ifdef DEBUG fscanf(fp, "%d %d %d %d", &traffic[i].x1, &traffic[i].y1, &traffic[i].x2, &traffic[i].y2);
#elsescanf("%d %d %d %d", &traffic[i].x1, &traffic[i].y1, &traffic[i].x2, &traffic[i].y2);
#endif} /* 获取小松所在路口和图书馆位置 */
#ifdef DEBUG fscanf(fp, "%d %d %d %d", &a.x, &a.y, &b.x, &b.y);
#elsescanf("%d %d %d %d", &a.x, &a.y, &b.x, &b.y);
#endif/* 构建道路 */ draw_roads();/* floyd 求最优路径 */ floyd();/* 输出结果 */printf("%d", dis[b.x][b.y]) ;
#ifdef DEBUGfclose(fp);
#endifreturn 0;
}

CODE[VS]1024 一塔湖图相关推荐

  1. 久久未至的Codevs1024一塔湖图解题报告

    一直想给这个题写个解题报告但是给忘了OTZ难产了这么久终于出来了 这个题当时坑了我一个星期整,所以一定要写一个解题报告纪念一下 1024 一塔湖图 时间限制: 1 s 空间限制: 128000 KB ...

  2. 一塔湖图(codevs 1024)

    题目描述 Description 小松所在的PK大学校园又称作燕园,是一个十分美丽的校园.有博雅塔,未名湖,亚洲最大的高校图书馆,人称"一塔湖图".但是由于燕园的历史比较悠久,所以 ...

  3. codevs1024一塔湖图(丧心病狂的建图)

    /* 丧心病狂的最短路 关键是建图 根据题目中给的路 拆出节点来 建图 (i,j) -->(j-1)*n+i 然后根据障碍 把死路 湖覆盖的dis改变成极大值 然后Floyd 然后 然后就没有然 ...

  4. [Codevs] 一塔湖图

    http://codevs.cn/problem/1024/ floyd 走起 #include <iostream> #include <cstdio> #include & ...

  5. 打造VS Code(支持Markdown/UML/脑图/代码模板)

    文章目录 Markdown 脑图 UML MD 中插入 UML 代码模板 mermaid 语法 小结 Visual Studio Code是一个文本编辑器,除了写代码和编辑普通文本外,借助插件还可以实 ...

  6. Visual Studio Code (echarts)数据可视化瀑布图实现及标题的格式设置标题背景颜色以及设置副标题和标题加边框,设置边框背景和边框颜色柱形图颜色及柱形图的宽度设置完整代码

    设置标题背景颜色以及设置副标题和标题加边框, 设置边框背景和边框颜色 柱形图颜色及柱形图的宽度设置完整代码 <!DOCTYPE html> <html lang="en&q ...

  7. PKU2019暑期学堂 游记

    诈尸写博客QaQ 一塔湖图 Day 0 18:00 从学校出发 with另外三个同学 前往南站 20:20上动车 感觉人好少的样子 房间灯是坏的,还换了一间... 在火车上刷知乎,提前体验一下夏令营, ...

  8. 把QQ群共享当做网盘用感觉还不错

    作者:iamlaosong 网上看到有人把QQ群的共享文件区当网盘用,试了一下,感觉还不错. 以前我是用QQ邮箱中的文件中转站当网盘使用的,准确的来说是当U盘使用.QQ邮箱中的记事本则用来记录一些备忘 ...

  9. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

最新文章

  1. Windbg学习使用
  2. pdf常用字体包 -baijiahao_PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
  3. 红包实名的背后,支付实名制如何影响产品设计?
  4. boost::mp11::mp_replace_if_q相关用法的测试程序
  5. Linux命令【二】终端+Vim
  6. quick time不可用是什么意思_fpga是什么意思(fpga怎么用)
  7. TypeScript接口
  8. cocos2d-js 网络请求之GET/POST
  9. 成都高端企业网站建设前网站推广优化战略规划成都辰星建站
  10. Python删除文件第一行
  11. CHI2019 ChewIt. An Intraoral Interface for Discreet Interactions
  12. 计算机环境变量怎么恢复默认,环境变量怎么还原
  13. php_version_too_low,以太坊常见问题和错误 / Web3j error:Intrinsic gas too low - 汇智网
  14. C盘各个文件的简单介绍
  15. 创新、创业,风险投资介绍。附:2019年热门风险投资人 ( VCPE )
  16. Vue路由实现SPA
  17. proteus 8 打开proteus 7版本仿真文件的两个方法
  18. 贷后评分模型的三种细分应用
  19. 转载~时间复杂度分析(个人强推)
  20. Matlab与单片机的串行通信及数据处理

热门文章

  1. Y - 献给杭电五十周年校庆的礼物
  2. C# in关键字你造吗
  3. 【华为机试真题详解】优选核酸检测点【2022 Q4 | 100分】
  4. SOD领域RGBD算法-训练集设置
  5. C语言 printf函数输出 以及 sizeOf函数的使用注意
  6. 白继平院长参加海南省第二人民医院医疗美容义诊
  7. 如何保存视频会议画面内容?视频会议截图功能
  8. raid技术基本原理
  9. 嵌入式开发:变得更加敏捷的5个技巧
  10. 3D打印入门必读工具书《解析3D打印机》免费下载!