Problem

给出一个类似华容道的图。\(q\)次询问,每次给你起始点,终止点,空格位置,让你求最少步数

\(n,m\le 30, q\le 500\).

Soultion

一道智障搜索题。

弱智想法最多80分。不用想了。我已经试过所有非O2的常数优化,还是有1.05秒。

考虑一下预处理。

事实上,我们发现只有当空格位置在初始点旁边时才会影响初始点(废话),所以我们可以先预处理在某一个点\((x,y)\)的四周,不经过这个点(x,y),到达这个点四周的最少步数。BFS解决。

然后每次询问时,就先把空格位置跑到初始点的四周,然后每次用预处理的去更新。

Code
#include <bits/stdc++.h>

#define I register int
#define F(i, a, b) for (I i = a; i <= b; i ++)
#define mem(a, b) memset(a, b, sizeof a) const int N = 31; const int dx[4] = { 1, 0 , 0, - 1};
const int dy[4] = { 0, - 1 , 1, 0}; using namespace std; int h, t, Ans, ex, ey, sx, sy, tx, ty;
int n, m, q, a[N + 1][N + 1];
int f[N][N][4], bz[N][N][N][N], vis[N][N];
struct node {
int x, y, k;
} d[N * N * N];
struct Node {
int x, y;
} D[N * N]; void Doit() {
int st = 0, en = 0; mem(f, 7), h = 0, D[t = 1] = {ex, ey}, mem(vis, 0), vis[ex][ey] = 1;
F(p, 0, 3) {
I xxx = ex + dx[p], yyy = ey + dy[p];
if (a[xxx][yyy] && xxx == sx && yyy == sy)
d[++ en] = {ex, ey, 3 - p}, f[ex][ey][3 - p] = 1;
}
while (h ++ < t) {
I x = D[h].x, y = D[h].y;
F(k, 0, 3) {
I xx = x + dx[k], yy = y + dy[k];
if (a[xx][yy] && !vis[xx][yy] && !(xx == sx && yy == sy)) {
vis[xx][yy] = vis[x][y] + 1, D[++ t] = {xx, yy};
F(p, 0, 3) {
I xxx = xx + dx[p], yyy = yy + dy[p];
if (a[xxx][yyy] && xxx == sx && yyy == sy)
d[++ en] = {xx, yy, 3 - p}, f[xx][yy][3 - p] = vis[xx][yy];
}
}
}
} while (st ++ < en) {
I x = d[st].x, y = d[st].y, k = d[st].k;
F(p, 0, 3) {
I xx = x + dx[p], yy = y + dy[p];
if (a[xx][yy] && f[xx][yy][p] > f[x][y][k] + bz[x][y][k][3 - p]) {
f[xx][yy][p] = f[x][y][k] + bz[x][y][k][3 - p];
d[++ en] = {xx, yy, p};
}
}
} int Ans = 1e8;
F(k, 0, 3)
Ans = min(Ans, f[tx][ty][k]);
printf("%d\n", Ans == 1e8 ? - 1 : Ans);
} int main() {
scanf("%d%d%d", &n, &m, &q);
F(i, 1, n)
F(j, 1, m)
scanf("%d", &a[i][j]); mem(bz, 7);
F(i, 1, n)
F(j, 1, m) {
if (!a[i][j]) continue;
F(k, 0, 3) {
int x = i + dx[k], y = j + dy[k], w = k;
if (!a[x][y]) continue;
h = 0, D[t = 1] = {x, y}, mem(vis, 0), bz[i][j][w][w] = 1, vis[x][y] = 1;
while (h ++ < t) {
x = D[h].x, y = D[h].y;
F(k, 0, 3) {
int xx = x + dx[k], yy = y + dy[k];
if (a[xx][yy] && !(xx == i && yy == j) && !vis[xx][yy]) {
vis[xx][yy] = vis[x][y] + 1, D[++ t] = {xx, yy};
F(k, 0, 3) {
int xxx = xx + dx[k], yyy = yy + dy[k];
if (a[xxx][yyy] && xxx == i && yyy == j)
bz[i][j][3 - w][k] = vis[xx][yy];
}
}
}
}
}
} F(i, 1, q) {
scanf("%d%d%d%d%d%d", &ex, &ey, &sx, &sy, &tx, &ty);
if (sx == tx && sy == ty) {
puts("0");
continue;
}
Doit();
}
}

3537. 【NOIP2013提高组day2】华容道(搜索 + 剪枝)的更多相关文章

  1. NOIP2013 提高组day2 3 华容道 BFS

    描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...

  2. 【华容道】题解(NOIP2013提高组day2)

    分析 这道题很容易想到令f[x][y][x1][y1]表示空白块在(x,y).指定棋子在(x1,y1)时的最少步数,让空白块和四周的棋子交换,当空白块要和指定棋子交换时,把指定棋子移动,搞一下BFS就 ...

  3. NOIP2013 提高组 Day2

    期望得分:100+100+30+=230+ 实际得分:100+70+30=200 T2 觉得题目描述有歧义: 若存在2i却不存在2i+1,自己按不合法做的,实际是合法的 T3  bfs 难以估分 虽然 ...

  4. NOIP2013提高组D2T3 华容道

    n<=30 * m<=30 的地图上,0表示墙壁,1表示可以放箱子的空地.q<=500次询问,每次问:当空地上唯一没有放箱子的空格子在(ex,ey)时,把位于(sx,sy)的箱子移动 ...

  5. 洛谷P1979 [NOIP2013提高组Day2T3]华容道

    P1979 华容道 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少 ...

  6. 积木大赛 noip2013提高组day2

    这道题一开始想到处理中间是0的位置,但这样时间太慢了,后来想到一种类似二分的方法,就是把这一段的最小值找到,全部减去最小值,然后有0一出现,就又递归处理前一段,每次答案就加上这一段的最小值: AC代码 ...

  7. NOIP2013 提高组day2 2 花匠 动规 找拐点 树状数组

    花匠 描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体 ...

  8. Noip2013 提高组 Day2 T1 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

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

    [NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...

随机推荐

  1. [20190416]11g下那些latch是Exclusive的.txt

    [20190416]11g下那些latch是Exclusive的.txt --//昨天测试了11g下那些latch是共享的,链接:--//是否反过来剩下的都是Exclusive的.继续测试: 1.环境 ...

  2. JAVA 递归实现从n个数中选取m个数的所有组合

    这周Java课程有个小作业:Java递归实现从n个数中选取m个数的所有组合 代码如下: //其中 n 取 1,2,3,4,5 五个数, m 取 3 package javaText; public c ...

  3. 浅谈TCP IP协议栈(四)IP协议解析

    通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输 ...

  4. jQuery如何制作动画

    下面为一组图片(四张)展示 1 2 3 4 页面代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  5. U盘中的快捷方式解析

    很多人都有使用绿色软件的习惯,在这里我简单称其为Portable App 将这些软甲放到U盘中随身携带,便于我们使用更加符合自身习惯的功能软件. 相信习惯将软件放到U盘启动都会碰到一个问题,就是每次打 ...

  6. LeetCode算法题-Average of Levels in Binary Tree(Java实现)

    这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...

  7. Autofs自动挂载探讨

    Autofs介绍: mount是用来挂载文件系统的,可以在系统启动的时候挂载也可以在系统启动后挂载.对于本地固定设 备,如硬盘可以使用mount挂载:而光盘.软盘.NFS.SMB等文件系统具有动态性, ...

  8. [已决解]关于Hadoop start-all.sh启动问题

    问题一:出现Attempting to operate on hdfs namenode as root 写在最前注意: 1.master,slave都需要修改start-dfs.sh,stop-df ...

  9. CMD 和 Git 中的代理设置

    CMD 设置代理 在 cmd 环境下设置代理可能不是很常用,但是某些情况下还是可能会用到,比如公司的电脑只能通过设置代理访问外网,而你需要在 cmd 环境下使用 gem 命令更新文件时. 当然,如果你 ...

  10. UVALive - 3713 - Astronauts(图论——2-SAT)

    Problem   UVALive - 3713 - Astronauts Time Limit: 3000 mSec Problem Description Input The input cont ...