输油管道(枚举)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输油管道(枚举)相关的知识,希望对你有一定的参考价值。

 题目描述
请你帮忙设计一个从城市M到城市Z的输油管道,现在已经把整个区域划分为R行C列,每个单元格可能是空的也可能是以下7种基本管道之一:
技术分享

油从城市M流向Z,‘+’型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:
技术分享
现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。
输入
第一行包含两个整数R和C(1<=R,C<=25)。
接下来R行每行C个字符描述被偷之后的形状,字符分为以下三种:
(1)‘.’表示空;
(2)字符‘|’(ASCII为124)、‘-’、‘+’、‘1’、‘2’、‘3’、‘4’描述管道的形状;
(3)‘M’和‘Z’表示城市,两个都是只出现一次。
输入保证石油的流向是唯一的,只有一个管道跟M和Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
输入保证有解而且是唯一的。
输出
输出被偷走的管道的行号和列号以及管道的类型。
样例输入
输入1:3 7........M-.-Z........输入2:3 5..1-M1-+..Z.23.输入3:6 10Z.1----4..|.|....|..|..14..M..2-+++4......2323..............
样例输出
输出1:2 4 -输出2:2 4 4输出3:3 3 |
数据范围限制
1<=R,C<=25

解题思路:

先把7种基本管道分类;

联通上下左右;

再枚举;

看看每一种通的口上有没有通的;

这个代码没处理边界,凑活着用

#include<bits/stdc++.h>
int search(int);
int find1(char);
int find2(char);
int find3(char);
int find4(char);
void fff();
int r,c;
char a[110][110];
int ans[110][110];
char s;
struct tt
{
    int upp;
    int downn;
    int leftt;
    int rightt;
}shape[10];
char left[10]={-,+,1,2,M,Z};
char right[10]={-,+,3,4,M,Z};
char up[10]={|,+,1,4,M,Z};
char down[10]={|,+,2,3,M,Z};
int main()
{
    freopen("OIL.txt","r",stdin);
    fff();
    memset(a,0,sizeof(a));
    memset(ans,0,sizeof(ans));
    scanf("%d%d",&r,&c);
    for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
    {
        scanf("%c",&s);
        if(s==\\n)
        {
            j=0;
            continue;
        }
        a[i][j]=s;
    }
    for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
    {
        if(a[i][j]==.)
        continue;
        if(a[i][j]==|)
        {
            if(find3(a[i-1][j])!=66)
            ans[i-1][j]+=2*shape[5].upp;
            if(find4(a[i+1][j])!=66)
            ans[i+1][j]+=1*shape[5].downn;
        }
        if(a[i][j]==-)
        {
            if(find1(a[i][j-1])!=66)
            ans[i][j-1]+=8*shape[6].leftt;
            if(find2(a[i][j+1])!=66)
            ans[i][j+1]+=4*shape[6].rightt;
        }
        if(a[i][j]==1)
        {
            if(find4(a[i+1][j])!=66)
            ans[i+1][j]+=1*shape[1].downn;
            if(find2(a[i][j+1])!=66)
            ans[i][j+1]+=4*shape[1].rightt;
        }
        if(a[i][j]==2)
        {
            if(find3(a[i][j+1])!=66)
            ans[i][j+1]+=4*shape[2].rightt;
            if(find2(a[i-1][j])!=66)
            ans[i-1][j]+=2*shape[2].upp;
        }
        if(a[i][j]==3)
        {
            if(find3(a[i-1][j])!=66)
            ans[i-1][j]+=2*shape[3].upp;
            if(find1(a[i][j-1])!=66)
            ans[i][j-1]+=8*shape[3].leftt;
        }
        if(a[i][j]==4)
        {
            if(find4(a[i+1][j])!=66)
            ans[i+1][j]+=1*shape[4].downn;
            if(find1(a[i][j-1])!=66)
            ans[i][j-1]+=8*shape[4].leftt;
        }
    if(a[i][j]==+)
    {
        if(find1(a[i][j-1])!=66)
            ans[i][j-1]+=8*shape[7].leftt;
        if(find3(a[i-1][j])!=66)
            ans[i-1][j]+=2*shape[7].upp;
        if(find2(a[i][j+1])!=66)
            ans[i][j+1]+=4*shape[7].rightt;
        if(find4(a[i+1][j])!=66)
            ans[i+1][j]+=1*shape[7].downn;
    }
    }
    search(0);
    return 0;
}
int find1(char x)
{
    for(int i=0;i<=10;i++)
    {
        if(left[i]==x)
        return 66;
    }
    return 0;
}
int find2(char x)
{
    for(int i=0;i<=10;i++)
    {
        if(right[i]==x)
        return 66;
    }
    return 0;
}
int find3(char x)
{
    for(int i=0;i<=10;i++)
    {
        if(up[i]==x)
        return 66;
    }
    return 0;
}
int find4(char x)
{
    for(int i=0;i<=10;i++)
    {
        if(down[i]==x)
        return 66;
    }
    return 0;
}
int search(int x)
{
    for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
    if(ans[i][j]>0)
        {x=ans[i][j];
        printf("%d %d ",i,j);}
        if(x==3)
        printf("%c",|);
        if(x==5)
        printf("%c",3);
        if(x==9)
        printf("%c",2);
        if(x==6)
        printf("%c",4);
        if(x==10)
        printf("%c",1);
        if(x==12)
        printf("%c",-);
}
void fff()
{
    shape[1].upp=0;
    shape[1].downn=1;
    shape[1].leftt=0;
    shape[1].rightt=1;
    shape[2].upp=1;
    shape[2].downn=0;
    shape[2].leftt=0;
    shape[2].rightt=1;
    shape[3].upp=1;
    shape[3].downn=0;
    shape[3].leftt=1;
    shape[3].rightt=0;
    shape[4].upp=0;
    shape[4].downn=1;
    shape[4].leftt=1;
    shape[4].rightt=0;
    shape[5].upp=1;
    shape[5].downn=1;
    shape[5].leftt=0;
    shape[5].rightt=0;
    shape[6].upp=0;
    shape[6].downn=0;
    shape[6].leftt=1;
    shape[6].rightt=1;
    shape[7].upp=1;
    shape[7].downn=1;
    shape[7].leftt=1;
    shape[7].rightt=1;
}

 





















以上是关于输油管道(枚举)的主要内容,如果未能解决你的问题,请参考以下文章

带有红宝石集合/可枚举的酷技巧和富有表现力的片段[关闭]

输油管道(枚举)

r 计算管道的步骤(基本片段)

15种Python片段去优化你的数据科学管道

在 Windows 中枚举命名管道

枚举Azure管道中的秘密变量