輸油管道(枚舉)
阿新 • • 發佈:2017-10-01
枚舉 劃分 多余 垂直 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; intrightt; }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; }
輸油管道(枚舉)