洛谷P2243 电路维修

P2243 电路维修

题目背景

Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上。在她无依无靠的时候,善良的运输队员Mark 和James 收留了她。Elf 很感谢Mark和James,可是一直也没能给他们帮上什么忙。

题目描述

有一天 Mark 和James 的飞行车没有办法启动了,经过检查发现原来是电路板的故障。飞行车的电路板设计很奇葩,如下图所示:

输入输出格式

输入格式:

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

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

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

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

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

输出格式:

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

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

输入输出样例

输入样例#1:

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

输出样例#1:

1

说明

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

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

/*
    提交超多通过率超低的题,总而言之算法秒掉了,然而在图论上本人自带不初始化buff。
    算法:我们把可以不旋转通过的边标记为0,需要旋转的标记为1,跑一次单源最短路,从左上到右下,易发现最短距离就是需要旋转的次数。
    (我们可以看成每次要用到旋转后的边,需要耗费1的价值,最后价值总和当然就是答案。)
    我们这样想,这是个图。可以数出来,节点数应当是(R+1)*(C+1)
    建图的时候,按如下方式分配点的编号。
    1 2 3 4 5 6
    7 8 9 10 11 12
    ...当然这是样例。我们可以发现,对于每个方格,需要标记四个点,四个点坐标可以轻易求得。
    这就是这部分的作用:
        int pos1=((i-1)*(C+1)+j); //左上
        int pos2=(i*(C+1)+j+1);      //右下
        int pos3=((i-1)*(C+1)+j+1);  //右上
        int pos4=(i*(C+1)+j);        //左下
    我们确定了四个点的位置,接下来就只需要连边了。(好在这道题对于内存没限制,随便开简直爽。)
    如果‘/‘就右上到左下连边,这条边权值为0(val=0)。连边要连双向(未证实,我这么连得。)
    同时也要双向的连一条从左上到右下的边,权值为1,表示旋转后的边。
    如果是’\‘则反之。
    图建好了,对于如此稠密的图我选择heap优化的dijkstra。不清楚其他单源能否过,但多源估计过不了。
    最后答案就是1到(R+1)*(C+1)的最短路

    我一开始用的priority_queue<pa,vector<pa>,greater<pa> >q; T一个点,换成结构体+重载运算符A了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 260000
int T,n,m,num,head[maxn],dis[maxn],cou;
bool vis[maxn];
struct node{
    int to,pre,v;
}e[maxn*10];
char ch[510];
void Insert(int from,int to,int v){
    e[++num].to=to;
    e[num].v=v;
    e[num].pre=head[from];
    head[from]=num;
}
int qread(){
    int i=0;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)ch=getchar();
    while(ch<=‘9‘&&ch>=‘0‘){i=i*10+ch-‘0‘;ch=getchar();}
    return i;
}
struct Node{
    int id,v;
    bool operator < (const Node x)const{
        return v>x.v;
    }
};
void Dij(){
    priority_queue<Node>q;
    memset(vis,0,sizeof(vis));
    memset(dis,127/3,sizeof(dis));
    dis[1]=0;
    Node cur;cur.id=1,cur.v=0;
    q.push(cur);
    while(!q.empty()){
        int point=q.top().id;q.pop();
        if(vis[point])continue;
        vis[point]=1;
        if(point==cou)return;
        for(int i=head[point];i;i=e[i].pre){
            int to=e[i].to;
            if(dis[to]>dis[point]+e[i].v){
                dis[to]=dis[point]+e[i].v;
                Node nxt;nxt.id=to,nxt.v=dis[to];
                q.push(nxt);
            }
        }
    }
}
int main(){
    freopen("Cola.txt","r",stdin);
    T=qread();
    while(T--){
        memset(head,0,sizeof(head));
        memset(e,0,sizeof(e));
        num=0;
        n=qread();m=qread();
        cou=(n+1)*(m+1);
        int a,b,c,d;
        for(int i=1;i<=n;i++){
            scanf("%s",ch+1);
            for(int j=1;j<=m;j++){
                int pos1=((i-1)*(m+1)+j);//左上
                int pos2=(i*(m+1)+j+1);//右下
                int pos3=((i-1)*(m+1)+j+1);//右上
                int pos4=(i*(m+1)+j);//左下
                if(ch[j]==‘\\‘){
                    Insert(pos1,pos2,0);Insert(pos2,pos1,0);
                    Insert(pos3,pos4,1);Insert(pos4,pos3,1);
                }
                else {
                    Insert(pos1,pos2,1);Insert(pos2,pos1,1);
                    Insert(pos3,pos4,0);Insert(pos4,pos3,0);
                }
            }
        }
        Dij();
        if(dis[cou]>=107406378)printf("NO SOLUTION\n");
        else printf("%d\n",dis[cou]);
    }
}
时间: 2024-10-24 16:28:20

洛谷P2243 电路维修的相关文章

洛谷 P2243 电路维修

P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给他们帮上什么忙. 题目描述 有一天 Mark 和James 的飞行车没有办法启动了,经过检查发现原来是电路板的故障.飞行车的电路板设计很奇葩,如下图所示: 输入输出格式 输入格式: 输入文件包含多组测试数据.第一行包含一个整数T 表示测试数据的数目. 对于每组测试数据,第一行包

luogu P2243 电路维修

P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给他们帮上什么忙. 题目描述 有一天 Mark 和James 的飞行车没有办法启动了,经过检查发现原来是电路板的故障.飞行车的电路板设计很奇葩,如下图所示: 输入输出格式 输入格式: 输入文件包含多组测试数据.第一行包含一个整数T 表示测试数据的数目. 对于每组测试数据,第一行包

洛谷P2242 公路维修问题

To 洛谷.2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且是笔直的.现在给出N个坑的位置,请你计算,最少要对多远的路段实施交通管制? 输入输出格式 输入格式: 输入数据共两行,第一行为两个正整数N.M (2<=N<=15000,M<=N).第二行给出了N个坑的坐标(坐标值均在长整范围内,按从小到大的顺序给出,且不会有两个点坐标相同). 输出格式:

洛谷 P2242 公路维修问题

P2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且是笔直的.现在给出N个坑的位置,请你计算,最少要对多远的路段实施交通管制? 输入输出格式 输入格式: 输入数据共两行,第一行为两个正整数N.M (2<=N<=15000,M<=N).第二行给出了N个坑的坐标(坐标值均在长整范围内,按从小到大的顺序给出,且不会有两个点坐标相同). 输出格式: 仅一行,为

洛谷P2242 公路维修问题(Road)

题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛,有些没有. 所有的牛棚有相同的宽度. 自门遗失以后,farmer John必须尽快在牛棚之前竖立起新的木板. 他的新木材供应商将会供应他任何他想要的长度,但是吝啬的供应商只能提供有限数目的木板. farmer John想将他购买的木板总长度减到最少. 给出:可能买到的木板最大的数目M(1<= M<

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不