CH2601 电路维修

描述

Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上。Rika的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障,导致无法启动。

电路板的整体结构是一个R行C列的网格(R,C≤500),如右图所示。每个格点都是电线的接点,每个格子都包含一个电子元件。电子元件的主要部分是一个可旋转的、连接一条对角线上的两个接点的短电缆。在旋转之后,它就可以连接另一条对角线的两个接点。电路板左上角的接点接入直流电源,右下角的接点接入飞行车的发动装置。

Ha'nyu发现因为某些元件的方向不小心发生了改变,电路板可能处于断路的状态。她准备通过计算,旋转最少数量的元件,使电源与发动装置通过若干条短缆相连。不过,电路的规模实在是太大了,Ha'nyu并不擅长编程,希望你能够帮她解决这个问题。

输入格式

输入文件包含多组测试数据。第一行包含一个整数T 表示测试数据的数目。

对于每组测试数据,第一行包含正整数R 和C,表示电路板的行数和列数。

之后R 行,每行C 个字符,字符是"/"和""中的一个,表示标准件的方向。

输出格式

对于每组测试数据,在单独的一行输出一个正整数,表示所需的缩小旋转次数。

如果无论怎样都不能使得电源和发动机之间连通,输出NO SOLUTION。

样例输入

1
3 5
\\/\\
\\///
/\\\\

样例输出

1

数据范围与约定

  • 对于40% 的数据,R,C≤5。

    对于100% 的数据,R,C≤500,T≤5。

样例解释

样例的输入对应于题目描述中的情况。

只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。

来源

杜宇飞,石家庄二中【Nescafé 5】杯NOIP模拟赛


思路

我们在格点建边,构成一个无向图。如果不用旋转就能到达,边权为0,否则为1。

然后广搜~

but 纯粹的广搜(或者SPFA?)是会炸的。。。

我得了70分。。。T了3个点。。。

我们可以考虑使用双端队列BFS

即如果边权为0,直接放到队首,如果边权为1,就和普通BFS一样放到队尾。

有时会出现这样一种情况:

最优值相同的点A,B都能更新C,A在队列中的位置在B前面。AC=1 BC=0

这样会导致最优值出现错误。所以我们还要判断能不能更新已有的点。

像上述这种情况,A更新C后,C‘会到队尾,B更新C后,C到队首,比之前的C'更快更新,C'不能再更新其他点,也就不会影响结果。

代码

#include<bits/stdc++.h>
using namespace std;
#define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout )
#define MAXN 505 int T;
int R, C;
char s[MAXN][MAXN];
int dis[MAXN][MAXN];
deque<int> Qx, Qy;
int x, y, tx, ty, t1, t2; char t;
int dir[4][2] = { 1, 1, -1, -1, 1, -1, -1, 1 };
int wh[4][2] = { 1, 1, 0, 0, 1, 0, 0, 1 }; int main(){
scanf( "%d", &T );
while( T-- ){
scanf( "%d%d", &R, &C );
for ( int i = 1; i <= R; ++i ) scanf( "%s", s[i] + 1 );
memset( dis, 0x7f, sizeof dis );
dis[0][0] = 0;
Qx.push_back(0); Qy.push_back(0);
while( !Qx.empty() ){
x = Qx.front(); y = Qy.front(); Qx.pop_front(); Qy.pop_front();
for ( int i = 0; i < 4; ++i ){
tx = x + dir[i][0]; ty = y + dir[i][1];
t1 = x + wh[i][0]; t2 = y + wh[i][1];
t = i <= 1 ? '\\' : '/';
if ( tx >= 0 && ty >= 0 && tx <= R && ty <= C && dis[tx][ty] > dis[x][y] + ( s[t1][t2] != t ) ){
dis[tx][ty] = dis[x][y] + ( s[t1][t2] != t );
if ( s[t1][t2] != t ) Qx.push_back(tx), Qy.push_back(ty);
else Qx.push_front(tx), Qy.push_front(ty);
}
}
}
if ( dis[R][C] >= 0x3f3f3f3f ) printf( "NO SOLUTION\n" );
else printf( "%d\n", dis[R][C] );
}
return 0;
}

「CH2601」 电路维修 解题报告的更多相关文章

  1. 「FJOI2016」神秘数 解题报告

    「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...

  2. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  3. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  4. 「NOI2015」寿司晚宴 解题报告

    「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...

  5. 「SCOI2015」国旗计划 解题报告

    「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...

  6. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

  7. 「JLOI2015」城池攻占 解题报告

    「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...

  8. 「JLOI2015」管道连接 解题报告

    「JLOI2015」管道连接 先按照斯坦纳树求一个 然后合并成斯坦纳森林 直接枚举树的集合再dp一下就好了 Code: #include <cstdio> #include <cct ...

  9. 「JLOI2015」战争调度 解题报告

    「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...

随机推荐

  1. C++构造函数和文件组织

    构造你的函数 在 main() 上方声明函数,并在 main 下方定义函数 在 main() 上方同时声明并定义函数. 随着 C++ 程序变得越来越复杂,你可能需要将代码分成多个文件.分开保存函数定义 ...

  2. Python进阶04函数的参数对应

    我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的 参数传递方式. 回忆一下位置传递: def f(a,b,c): return ...

  3. SuperSocket获取会话的连接和断开事件

    关键字: 连接事件, 断开事件, OnSessionStarted,OnSessionClosed, NewSessionConnected, SessionClosed AppSession 的虚方 ...

  4. [转]敏捷开发需求管理(产品backlog)

    传统的瀑布工作模式使用详细的需求说明书来表达需求,需求人员负责做需求调研,根据调研情况编制详细的需求说明书,进行需求评审,评审之后签字确认交给研发团队设计开发.在这样的环境下,需求文档是信息传递的主体 ...

  5. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  6. X Samara Regional Intercollegiate Programming Contest

    A. Streets of Working Lanterns - 2 对于每个括号序列,存在一个\(mv\),表示要接上这个序列至少需要\(-mv\)个左括号,同时处理出接上这个序列后,左括号数量的增 ...

  7. Python--day48--面向对象回顾

    面向对象回顾: 例1: 例2: 特殊方法(要背会):

  8. Python--day47--mysql执行计划

    1,什么是mysql执行计划? 让mysql预估执行操作:在要执行的语句前面加explain,就不会真的执行sql语句,只是给出了要执行的数据的情况,如大约有多少条,查询类型.

  9. [转]Win10下安装Linux子系统

    工作以来一直DotNet系偏C/S, 接触Web开发的时间也不长, 现在主要偏向Web全栈方向, 一直对Linux系统心生向往, 夜深了娃睡了, 打开老旧的笔记本来折腾一下. 准备工作 控制面板 &g ...

  10. ArrayList中remove方法和set(null)的区别

    在分析源码ArrayList.remove()时,偶然发现了一个疑惑的点,就是:源码也是将最后一个对象的引用指向null(源码:elementData[--size] = null; // clear ...