传送门

分析

暴力能拿 \(60\) ~ \(70pts\) 。

具体的...以后再更吧

代码

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 1e7
#define il inline
#define re register
#define tie0 cin.tie(0),cout.tie(0)
#define fastio ios::sync_with_stdio(false)
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
using namespace std;
typedef long long ll;template <typename T> inline void read(T &x) {T f = 1; x = 0; char c;for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1;for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);x *= f;
}struct edge {int to, nxt, val;
} e[40010];const int dx[5] = {-1, 1, 0, 0};
const int dy[5] = {0, 0, -1, 1};int n, m, q, ans;
int head[4005], cnt;
int g[33][33], qx[1003], qy[1003], dis[35][35], d[4011];
bool vis[4011];void insert(int u, int v, int w) {e[++cnt].to = v, e[cnt].val = w, e[cnt].nxt = head[u], head[u] = cnt;
}void bfs(int sx, int sy, int tx, int ty, int opt) {memset(dis, 0, sizeof(dis));int head = 1, tail = 1, x, y;qx[1] = sx, qy[1] = sy, dis[sx][sy] = 1;while (head <= tail) {x = qx[head], y = qy[head];for (int i = 0; i < 4; ++i) {int nx = x + dx[i], ny = y + dy[i];if (g[nx][ny] && !dis[nx][ny] && (nx != tx || ny != ty))qx[++tail] = nx, qy[tail] = ny, dis[nx][ny] = dis[x][y] + 1;}++head;}if (opt == 4) return;for (int i = 0; i < 4; ++i) {int nx = tx + dx[i], ny = ty + dy[i];if ((nx != sx || ny != sy) && dis[nx][ny])insert(tx*120 + ty*4 + opt, tx*120 + ty*4 + i, dis[nx][ny] - 1);}insert(tx*120 + ty*4 + opt, sx*120 + sy*4 + opt ^ 1, 1);
}void SPFA(int tx, int ty) {for (int i = 0; i <= 4000; ++i) d[i] = INF, vis[i] = 0;queue <int> q;for (int i = 0; i < 4; ++i) {int nx = tx + dx[i], ny = ty + dy[i], nd = tx*120 + ty*4 + i;if (dis[nx][ny]) {d[nd] = dis[nx][ny] - 1;q.push(nd); vis[nd] = 1;}}while (!q.empty()) {int u = q.front(); q.pop(); vis[u] = 0;for (int i = head[u]; i >= 0; i = e[i].nxt) {int v = e[i].to, w = e[i].val;if (d[u] + w < d[v]) {d[v] = d[u] + w;if (!vis[v]) {q.push(v); vis[v] = 1;}}}}
}int main() {memset(head, -1, sizeof(head));read(n), read(m), read(q);for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)read(g[i][j]);for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)if (g[i][j]) {if (g[i-1][j]) bfs(i - 1, j, i, j, 0);if (g[i+1][j]) bfs(i + 1, j, i, j, 1);if (g[i][j-1]) bfs(i, j - 1, i, j, 2);if (g[i][j+1]) bfs(i, j + 1, i, j, 3);}int ex, ey, sx, sy, tx, ty;while (q--) {ans = INF;read(ex), read(ey), read(sx), read(sy), read(tx), read(ty);if (sx == tx && sy == ty) {puts("0"); continue;}bfs(ex, ey, sx, sy, 4);SPFA(sx, sy);for (int i = 0; i < 4; ++i) ans = min(ans, d[tx*120 + ty*4 +i]);if (ans >= INF) puts("-1");else printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/hlw1/p/11437369.html

NOIP2013 华容道相关推荐

  1. 刷题记录:牛客NC16536[NOIP2013]华容道

    传送门:牛客 题目描述: 题目较长,此处略 这道题的难度在洛谷上达到了紫题的水准,感觉还是有难度的( 花了我几乎5个小时 ),并且在没有看题解之前,根本不知道怎么做,脑中能想到的只有感觉会被T掉的算法 ...

  2. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...

  3. 语法入门*算法入门题单

    作者:王清楚 链接:https://ac.nowcoder.com/discuss/817596?type=101&order=0&pos=1&page=4&chann ...

  4. 【新手上路】语法入门算法入门题单

    作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...

  5. 算法初探系列5 - 广度优先搜索之状态表示

    概述 上节课我们学习了在简单迷宫问题中如何使用BFS求解,这次我们来讲解一下较复杂 ~~(花里胡哨)~~ 的迷宫问题 复习+延伸(多起点BFS) 在普通bfs问题中,我们先将起点入队,然后一直从起点延 ...

  6. 【题解】P1979 [NOIP2013 提高组] 华容道(SPFA,BFS,常数优化)

    [题解]P1979 [NOIP2013 提高组] 华容道 最近打比赛次次挂..平均每周得被至少一场比赛打击一次(这周好不容易 ABC 打的还行模拟赛又挂--)心烦意乱.写篇题解疏散一下内心的苦闷(雾) ...

  7. 【NOIP2013】华容道 最短路优化搜索(spfa)

    华容道 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 34  Solved: 14 [Submit][Status][Web Board] Descr ...

  8. python华容道最短路径_SSOJ1322华容道(NOIP2013)

    题目大意:在一个棋盘上,0不能做,1可以走,现在要将一个棋子移动到目标位置,移动时只能跟空格(只有一个)交换位置,至少要多少步? 题目描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一 ...

  9. P1979 [NOIP2013 提高组] 华容道

    题目来源 [NOIP2013 提高组] 华容道 - 洛谷 题目考点 搜索   图论 题目 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, ...

最新文章

  1. [译] RabbitMQ tutorials (3) ---- 'Pub/Sub' (Javascript)
  2. 51NOD 1138 连续整数的和
  3. matlab读int16读文件_Matlab文件操作及读txt文件(fopen,fseek,fread,fclose)
  4. cisco 生成树协议PVST+
  5. SQL语句 怎么把从一个表中查出来数据插入到另一个表中
  6. linux中的man文档结构
  7. oracle之数据处理之约束2
  8. bzoj2818: Gcd
  9. 父子类之间,成员函数重写、重载以及重定义的区别
  10. 添加用户到sudoers
  11. 生成商品条形码代码事例
  12. mysql 分页_MySQL如何实现分页查询
  13. win10如何找计算机管理员密码,win10怎么修改administrator账户密码 win10修改管理员账户密码方法...
  14. Proteus仿真-51单片机最小系统点亮LED
  15. Linux中的基础指令
  16. 乔布斯去世十年,粉丝哀叹苹果正失去昔日创新光环,但库克是更好领导者
  17. 为什么百度查到的ip和ipconfig查到的不一样?
  18. 干货分享!怎么复制硬盘到新硬盘
  19. cf103202M. United in Stormwind
  20. java调用快递物流接口api

热门文章

  1. 2022-2028年中国顺丁橡胶行业发展模式分析及市场分析预测报告
  2. 2021年中国服装行业分析报告-产业规模现状与发展规划趋势
  3. python中如何对复杂的json数据快速查找key对应的value值(使用JsonSearch包)
  4. 确定修改——取消修改
  5. 命令行带参数启动--命令行相关问题 代码规范
  6. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
  7. dataframe构建
  8. LeetCode简单题之托普利茨矩阵
  9. Apache POI:解决数据库和Excel之间相互转换的烦恼~
  10. 智能物联网(AIoT,2020年)(中)