输油管道(枚举)
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; }
以上是关于输油管道(枚举)的主要内容,如果未能解决你的问题,请参考以下文章