1. 程式人生 > >輸油管道(枚舉)

輸油管道(枚舉)

枚舉 劃分 多余 垂直 clas .com int 表示 水平

題目描述
請你幫忙設計一個從城市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; }

輸油管道(枚舉)