#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct point{//結構存x,y座標,和指向下個座標
int x;
int y;
struct point *next;
};
typedef struct point POINT;//讓節點好假設
int MAX(int Mx[],int My[],int MummyNum){ //求所有木乃伊X,Y座標的最大值
int i,j,max1,max2;//設定變數,先求X絕對值的最大,在求Y,然後比較
max1
=abs(Mx
[0]);//X最大,設第一個最大 max2
=abs(My
[0]);//Y最大,設第一個最大 for(i=1;i<MummyNum;i++){//把每個點都下去比較,分別求出X及Y部分的最大
if(abs(Mx
[i
])>=max1
){max1
=abs(Mx
[i
]);} if(abs(My
[i
])>=max2
){max2
=abs(My
[i
]);} }
if(max1>=max2){return max1;}//比較X及Y部分的最大,回傳
else
return max2;
}
void close(int x,int y,int Hx,int Hy,FILE *ptr1){//讓點x,y往目的地Hx,Hy移動,印到檔案ptr1
if((Hx==x)&&(Hy==y)){
if(abs(Hx
)>abs(Hy
)){if(Hx
>=0){x
++;fprintf(ptr1
,"(%d,%d)",x
,y
);}//判斷走到目的地時,判斷x,y座標大小,詳細看專題報告 if(Hx
<0){x
--;fprintf(ptr1
,"(%d,%d)",x
,y
);}} else
{
if(Hy
>=0){y
++;fprintf(ptr1
,"(%d,%d)",x
,y
);} if(Hy
<0){y
--;fprintf(ptr1
,"(%d,%d)",x
,y
);}
}
}
else if((Hx
>x
)&&(Hy
==y
)){x
++;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的右方,所以往右走一步,再把點帶入,重複執行 else if((Hx
>x
)&&(Hy
>y
)){x
++;y
++;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的右上方,所以往右上走一步,再把點帶入,重複執行 else if((Hx
==x
)&&(Hy
>y
)){y
++;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的上方,所以往上走一步,再把點帶入,重複執行 else if((Hx
<x
)&&(Hy
>y
)){x
--;y
++;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的左上方,所以往左上走一步,再把點帶入,重複執行 else if((Hx
<x
)&&(Hy
==y
)){x
--;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的左方,所以往左走一步,再把點帶入,重複執行 else if((Hx
<x
)&&(Hy
<y
)){x
--;y
--;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的左下方,所以往左下走一步,再把點帶入,重複執行 else if((Hx
==x
)&&(Hy
<y
)){y
--;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的下方,所以往下走一步,再把點帶入,重複執行 else if((Hx
>x
)&&(Hy
<y
)){x
++;y
--;fprintf(ptr1
,"(%d,%d)",x
,y
);close
(x
,y
,Hx
,Hy
,ptr1
);}//目的地在點的右下方,所以往右下走一步,再把點帶入,重複執行
}
int find(POINT *data,int a,int b){//尋找點,被儲存的座標鏈結裡,如果有此座標,回傳0,沒有就1
while(data!=NULL){
if(data->x==a&&data->y==b){return 0;}
else
data=data->next;
}
return 1;
}
int Mx[10000];//全域,存木乃伊座標和人座標
int My[10000];
int Hx[10000];
int Hy[10000];
int main(){
FILE *ptr,*ptr1;//開出2個指向檔案的指標
int MummyNum;//木乃伊個數
int result=0,tmp=0,max,check=1;//參數,功能會講解
POINT *point,*current,*previous;//節點指標
int s1,s2,s3,s4;//參數
int STEP=1,num=1;//參數,功能會講解
int a,b,c,d,e,f,i,j,k,l,q=1;//一些小變數,其中q為次數,亦即總共執行幾次
ptr
=fopen("input1.txt","r");//開檔,只能讀取 ptr1
=fopen("output1.txt","w");//開檔,只能寫入 if(ptr!=NULL&&ptr1!=NULL){//如果以上2個開檔成功的話,就執行以下動作
fscanf(ptr
,"%d",&MummyNum
);//從讀取檔案讀進木乃伊個數 while(MummyNum!=(-1)){//如果木乃伊個數不等於-1,執行以下動作
for(i=0;i<MummyNum;i++){//讀取木乃伊的座標
fscanf(ptr
,"%d%d",&Mx
[i
],&My
[i
]); }
max=MAX(Mx,My,MummyNum);//求所有木乃伊X,Y座標的最大值,作用請看簡報
STEP=1;//步數一開始為一步
check=1;
while(check!=0){//要判斷以原點為中心向外擴張的面積是否有被木乃伊擴張的覆蓋,其中check一開始只是驅動while
check=0; //接下來的check將等於沒被覆蓋的面積,因為都被覆蓋,理論上等於0
for(i=0;i<MummyNum;i++){
a=Mx[i]+STEP;//把每個木乃伊所擴張的面積覆蓋,分為上下左右
b=Mx[i]-STEP;
c=My[i]+STEP;
d=My[i]-STEP;
if(i==0){
for(j=b;j<=a;j++){ //把所有被覆蓋面積的點座標,存成鏈結
for(k=d;k<=c;k++){
current
=(POINT
*)malloc(sizeof(POINT
));current
->x
=j
;current
->y
=k
;if(j
==b
&&k
==d
){point
=current
;previous
=current
;}else{previous
->next
=current
;current
->next
=NULL
;previous
=current
;} }}
}
else{
for(j=b;j<=a;j++){
for(k=d;k<=c;k++){
current
=(POINT
*)malloc(sizeof(POINT
));current
->x
=j
;current
->y
=k
;previous
->next
=current
;current
->next
=NULL
;previous
=current
;} }}
}
e=(-1)*STEP;/*擴張人的範圍,判斷是否被覆蓋*/
f=STEP;
for(i=e;i<=f;i++){ /*判斷人所行範圍內,是否已全部被木乃伊覆蓋,用FIND尋找那個鏈結裡的點座標是否符合,沒找到會+1*/
for(j=e;j<=f;j++){
check+=find(point,i,j);
}}
STEP++;/*步數一值增加*/
if((STEP
-1)>max
){fprintf(ptr1
,"case%d:NEVER!!",q
);break;}//如果超過最大值,則抓不到,看專題報告 }
if((STEP-1)<=max){//如果不是never,則代表會被抓到
tmp=STEP-2;//我們要找出前一步的情況,因為STEP往上加會多一步,所以-1為正確步數,在-1才是前ㄧ步
s1=0;//驅動變數
s2=0;
s3=0;
s4=0;
for(i=0;i<MummyNum;i++){
a=Mx[i]+tmp;//把每個木乃伊所擴張的面積覆蓋,分為上下左右
b=Mx[i]-tmp;
c=My[i]+tmp;
d=My[i]-tmp;
if(i==0){//把前一步被覆蓋時的所有座標儲存成鏈結
for(j=b;j<=a;j++){
for(k=d;k<=c;k++){
current
=(POINT
*)malloc(sizeof(POINT
));current
->x
=j
;current
->y
=k
;if(j
==b
&&k
==d
){point
=current
;previous
=current
;}else{previous
->next
=current
;current
->next
=NULL
;previous
=current
;} }}
}
else{
for(j=b;j<=a;j++){
for(k=d;k<=c;k++){
current
=(POINT
*)malloc(sizeof(POINT
));current
->x
=j
;current
->y
=k
;previous
->next
=current
;current
->next
=NULL
;previous
=current
;} }}
}
e=(-1)*(tmp);//這時我們要找出這ㄧ步,位置為空的地方
f=tmp;
for(i=e;i<=f;i++){current=point;s1+=find(current,f,i);if(s1!=0){Hx[tmp]=f;Hy[tmp]=i;break;}} //如果其中有點為空的,把它存下來,雖然有可能有2個以上
for(i=e;i<=f;i++){current=point;s2+=find(current,e,i);if(s2!=0){Hx[tmp]=e;Hy[tmp]=i;break;}}//不過只需要一個,因此被置換掉沒差
for(i=e;i<=f;i++){current=point;s3+=find(current,i,f);if(s3!=0){Hx[tmp]=i;Hy[tmp]=f;break;}}
for(i=e;i<=f;i++){current=point;s4+=find(current,i,e);if(s4!=0){Hx[tmp]=i;Hy[tmp]=e;break;}}
//做完以上,已經弄完一個情況了
fprintf(ptr1
,"case%d:%d(0,0)",q
,STEP
-1);//印出步數 close(0,0,Hx[tmp],Hy[tmp],ptr1);}//把原點朝著我們剛剛找出為空的位置前進
q++;//次數+1
fscanf(ptr
,"%d",&MummyNum
);//重複跑,如果為-1,往下跳
}
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPG1hdGguaD4KCnN0cnVjdCBwb2ludHsvL+e1kOani+WtmHgseeW6p+aome+8jOWSjOaMh+WQkeS4i+WAi+W6p+aomSAKICAgICAgICBpbnQgeDsKICAgICAgICBpbnQgeTsKICAgICAgICBzdHJ1Y3QgcG9pbnQgKm5leHQ7CiAgICAgICAgfTsKICAgICAgICAKdHlwZWRlZiAgc3RydWN0IHBvaW50IFBPSU5UOy8v6K6T56+A6bue5aW95YGH6KitICAgICAgIAoKaW50IE1BWChpbnQgTXhbXSxpbnQgTXlbXSxpbnQgTXVtbXlOdW0peyAvL+axguaJgOacieacqOS5g+S8iljvvIxZ5bqn5qiZ55qE5pyA5aSn5YC8IAogICAgaW50IGksaixtYXgxLG1heDI7Ly/oqK3lrprorormlbjvvIzlhYjmsYJY57WV5bCN5YC855qE5pyA5aSn77yM5Zyo5rGCWe+8jOeEtuW+jOavlOi8gyAKICAgIG1heDE9YWJzKE14WzBdKTsvL1jmnIDlpKfvvIzoqK3nrKzkuIDlgIvmnIDlpKcgCiAgICBtYXgyPWFicyhNeVswXSk7Ly9Z5pyA5aSn77yM6Kit56ys5LiA5YCL5pyA5aSnICAKICAgIGZvcihpPTE7aTxNdW1teU51bTtpKyspey8v5oqK5q+P5YCL6bue6YO95LiL5Y675q+U6LyD77yM5YiG5Yil5rGC5Ye6WOWPilnpg6jliIbnmoTmnIDlpKcgCiAgICAgICAgaWYoYWJzKE14W2ldKT49bWF4MSl7bWF4MT1hYnMoTXhbaV0pO30gICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmKGFicyhNeVtpXSk+PW1heDIpe21heDI9YWJzKE15W2ldKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIGlmKG1heDE+PW1heDIpe3JldHVybiBtYXgxO30vL+avlOi8g1jlj4pZ6YOo5YiG55qE5pyA5aSn77yM5Zue5YKzIAogICAgZWxzZSAKICAgIHJldHVybiBtYXgyOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAp2b2lkIGNsb3NlKGludCB4LGludCB5LGludCBIeCxpbnQgSHksRklMRSAqcHRyMSl7Ly/orpPpu554LHnlvoDnm67nmoTlnLBIeCxIeeenu+WLle+8jOWNsOWIsOaqlOahiHB0cjEgCiBpZigoSHg9PXgpJiYoSHk9PXkpKXsKICAgICAgIGlmKGFicyhIeCk+YWJzKEh5KSl7aWYoSHg+PTApe3grKztmcHJpbnRmKHB0cjEsIiglZCwlZCkiLHgseSk7fS8v5Yik5pa36LWw5Yiw55uu55qE5Zyw5pmC77yM5Yik5pa3eCx55bqn5qiZ5aSn5bCP77yM6Kmz57Sw55yL5bCI6aGM5aCx5ZGKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEh4PDApe3gtLTtmcHJpbnRmKHB0cjEsIiglZCwlZCkiLHgseSk7fX0KICAgICAgIGVsc2UKICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBpZihIeT49MCl7eSsrO2ZwcmludGYocHRyMSwiKCVkLCVkKSIseCx5KTt9ICAgICAgICAgICAgICAgCiAgICAgICAgICBpZihIeTwwKXt5LS07ZnByaW50ZihwdHIxLCIoJWQsJWQpIix4LHkpO30gICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB9ICAgIAogZWxzZSBpZigoSHg+eCkmJihIeT09eSkpe3grKztmcHJpbnRmKHB0cjEsIiglZCwlZCkiLHgseSk7Y2xvc2UoeCx5LEh4LEh5LHB0cjEpO30vL+ebrueahOWcsOWcqOm7nueahOWPs+aWue+8jOaJgOS7peW+gOWPs+i1sOS4gOatpe+8jOWGjeaKium7nuW4tuWFpe+8jOmHjeikh+Wft+ihjCAKIGVsc2UgaWYoKEh4PngpJiYoSHk+eSkpe3grKzt5Kys7ZnByaW50ZihwdHIxLCIoJWQsJWQpIix4LHkpO2Nsb3NlKHgseSxIeCxIeSxwdHIxKTt9Ly/nm67nmoTlnLDlnKjpu57nmoTlj7PkuIrmlrnvvIzmiYDku6XlvoDlj7PkuIrotbDkuIDmraXvvIzlho3miorpu57luLblhaXvvIzph43opIfln7fooYwKIGVsc2UgaWYoKEh4PT14KSYmKEh5PnkpKXt5Kys7ZnByaW50ZihwdHIxLCIoJWQsJWQpIix4LHkpO2Nsb3NlKHgseSxIeCxIeSxwdHIxKTt9Ly/nm67nmoTlnLDlnKjpu57nmoTkuIrmlrnvvIzmiYDku6XlvoDkuIrotbDkuIDmraXvvIzlho3miorpu57luLblhaXvvIzph43opIfln7fooYwgICAgICAgICAgICAgICAgICAgICAgICAgCiBlbHNlIGlmKChIeDx4KSYmKEh5PnkpKXt4LS07eSsrO2ZwcmludGYocHRyMSwiKCVkLCVkKSIseCx5KTtjbG9zZSh4LHksSHgsSHkscHRyMSk7fS8v55uu55qE5Zyw5Zyo6bue55qE5bem5LiK5pa577yM5omA5Lul5b6A5bem5LiK6LWw5LiA5q2l77yM5YaN5oqK6bue5bi25YWl77yM6YeN6KSH5Z+36KGMCiBlbHNlIGlmKChIeDx4KSYmKEh5PT15KSl7eC0tO2ZwcmludGYocHRyMSwiKCVkLCVkKSIseCx5KTtjbG9zZSh4LHksSHgsSHkscHRyMSk7fS8v55uu55qE5Zyw5Zyo6bue55qE5bem5pa577yM5omA5Lul5b6A5bem6LWw5LiA5q2l77yM5YaN5oqK6bue5bi25YWl77yM6YeN6KSH5Z+36KGMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIGVsc2UgaWYoKEh4PHgpJiYoSHk8eSkpe3gtLTt5LS07ZnByaW50ZihwdHIxLCIoJWQsJWQpIix4LHkpO2Nsb3NlKHgseSxIeCxIeSxwdHIxKTt9Ly/nm67nmoTlnLDlnKjpu57nmoTlt6bkuIvmlrnvvIzmiYDku6XlvoDlt6bkuIvotbDkuIDmraXvvIzlho3miorpu57luLblhaXvvIzph43opIfln7fooYwKIGVsc2UgaWYoKEh4PT14KSYmKEh5PHkpKXt5LS07ZnByaW50ZihwdHIxLCIoJWQsJWQpIix4LHkpO2Nsb3NlKHgseSxIeCxIeSxwdHIxKTt9Ly/nm67nmoTlnLDlnKjpu57nmoTkuIvmlrnvvIzmiYDku6XlvoDkuIvotbDkuIDmraXvvIzlho3miorpu57luLblhaXvvIzph43opIfln7fooYwKIGVsc2UgaWYoKEh4PngpJiYoSHk8eSkpe3grKzt5LS07ZnByaW50ZihwdHIxLCIoJWQsJWQpIix4LHkpO2Nsb3NlKHgseSxIeCxIeSxwdHIxKTt9Ly/nm67nmoTlnLDlnKjpu57nmoTlj7PkuIvmlrnvvIzmiYDku6XlvoDlj7PkuIvotbDkuIDmraXvvIzlho3miorpu57luLblhaXvvIzph43opIfln7fooYwKICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCmludCBmaW5kKFBPSU5UICpkYXRhLGludCBhLGludCBiKXsvL+Wwi+aJvum7nu+8jOiiq+WEsuWtmOeahOW6p+aomemPiOe1kOijoe+8jOWmguaenOacieatpOW6p+aome+8jOWbnuWCszDvvIzmspLmnInlsLExIAogICAgd2hpbGUoZGF0YSE9TlVMTCl7CiAgaWYoZGF0YS0+eD09YSYmZGF0YS0+eT09Yil7cmV0dXJuIDA7fSAgIAogICAgZWxzZSAKICAgIGRhdGE9ZGF0YS0+bmV4dDsKfQogICByZXR1cm4gMTsgCn0KCmludCBNeFsxMDAwMF07Ly/lhajln5/vvIzlrZjmnKjkuYPkvIrluqfmqJnlkozkurrluqfmqJkgCmludCBNeVsxMDAwMF07CmludCBIeFsxMDAwMF07CmludCBIeVsxMDAwMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAppbnQgbWFpbigpewogICAgCiAgICBGSUxFICpwdHIsKnB0cjE7Ly/plovlh7oy5YCL5oyH5ZCR5qqU5qGI55qE5oyH5qiZIAogICAgaW50IE11bW15TnVtOy8v5pyo5LmD5LyK5YCL5pW4IAogICAgaW50IHJlc3VsdD0wLHRtcD0wLG1heCxjaGVjaz0xOy8v5Y+D5pW477yM5Yqf6IO95pyD6Kyb6KejIAogICAgUE9JTlQgKnBvaW50LCpjdXJyZW50LCpwcmV2aW91czsvL+evgOm7nuaMh+aomSAKICAgIGludCBzMSxzMixzMyxzNDsvL+WPg+aVuCAKICAgICAKICAgIGludCBTVEVQPTEsbnVtPTE7Ly/lj4PmlbjvvIzlip/og73mnIPorJvop6MgCiAgICBpbnQgYSxiLGMsZCxlLGYsaSxqLGssbCxxPTE7Ly/kuIDkupvlsI/orormlbjvvIzlhbbkuK1x54K65qyh5pW477yM5Lqm5Y2z57i95YWx5Z+36KGM5bm+5qyhIAogICAgCiAgICBwdHI9Zm9wZW4oImlucHV0MS50eHQiLCJyIik7Ly/plovmqpTvvIzlj6rog73oroDlj5YgCiAgICBwdHIxPWZvcGVuKCJvdXRwdXQxLnR4dCIsInciKTsvL+mWi+aqlO+8jOWPquiDveWvq+WFpSAKICAgIGlmKHB0ciE9TlVMTCYmcHRyMSE9TlVMTCl7Ly/lpoLmnpzku6XkuIoy5YCL6ZaL5qqU5oiQ5Yqf55qE6Kmx77yM5bCx5Z+36KGM5Lul5LiL5YuV5L2cIAogICAgCiAgICBmc2NhbmYocHRyLCIlZCIsJk11bW15TnVtKTsvL+W+nuiugOWPluaqlOahiOiugOmAsuacqOS5g+S8iuWAi+aVuCAKICAgIHdoaWxlKE11bW15TnVtIT0oLTEpKXsvL+WmguaenOacqOS5g+S8iuWAi+aVuOS4jeetieaWvC0x77yM5Z+36KGM5Lul5LiL5YuV5L2cIAogICAgCiAgICBmb3IoaT0wO2k8TXVtbXlOdW07aSsrKXsvL+iugOWPluacqOS5g+S8iueahOW6p+aomSAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICBmc2NhbmYocHRyLCIlZCVkIiwmTXhbaV0sJk15W2ldKTsgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICBtYXg9TUFYKE14LE15LE11bW15TnVtKTsvL+axguaJgOacieacqOS5g+S8iljvvIxZ5bqn5qiZ55qE5pyA5aSn5YC877yM5L2c55So6KuL55yL57Ch5aCxIAogICAgU1RFUD0xOy8v5q2l5pW45LiA6ZaL5aeL54K65LiA5q2lIAogICAgCiAgICAgCiAgICAgICAgICAgY2hlY2s9MTsgICAgICAgICAgICAgICAgICAgICAgCiAgICB3aGlsZShjaGVjayE9MCl7Ly/opoHliKTmlrfku6Xljp/pu57ngrrkuK3lv4PlkJHlpJbmk7TlvLXnmoTpnaLnqY3mmK/lkKbmnInooqvmnKjkuYPkvIrmk7TlvLXnmoTopobok4vvvIzlhbbkuK1jaGVja+S4gOmWi+Wni+WPquaYr+mpheWLlXdoaWxlIAogICAgICAgICAgY2hlY2s9MDsgICAgLy/mjqXkuIvkvobnmoRjaGVja+Wwh+etieaWvOaykuiiq+imhuiTi+eahOmdouepje+8jOWboOeCuumDveiiq+imhuiTi++8jOeQhuirluS4iuetieaWvDAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICBmcmVlKHBvaW50KTsvL+mHi+aUvuevgOm7nuizh+aWmSAKICAgICAgICAgIAogICAgCiAgICBmb3IoaT0wO2k8TXVtbXlOdW07aSsrKXsKICAgICAgICBhPU14W2ldK1NURVA7Ly/miormr4/lgIvmnKjkuYPkvIrmiYDmk7TlvLXnmoTpnaLnqY3opobok4vvvIzliIbngrrkuIrkuIvlt6blj7MgCiAgICAgICAgYj1NeFtpXS1TVEVQOwogICAgICAgIGM9TXlbaV0rU1RFUDsKICAgICAgICBkPU15W2ldLVNURVA7CiAgICAgICAgCiAgICAgICAgIGlmKGk9PTApewogICAgICAgZm9yKGo9YjtqPD1hO2orKyl7IC8v5oqK5omA5pyJ6KKr6KaG6JOL6Z2i56mN55qE6bue5bqn5qiZ77yM5a2Y5oiQ6Y+I57WQIAogICAgICAgICAgZm9yKGs9ZDtrPD1jO2srKyl7CiAgICAgICAgICAgIGN1cnJlbnQ9KFBPSU5UICopbWFsbG9jKHNpemVvZihQT0lOVCkpO2N1cnJlbnQtPng9ajtjdXJyZW50LT55PWs7aWYoaj09YiYmaz09ZCl7cG9pbnQ9Y3VycmVudDtwcmV2aW91cz1jdXJyZW50O31lbHNle3ByZXZpb3VzLT5uZXh0PWN1cnJlbnQ7Y3VycmVudC0+bmV4dD1OVUxMO3ByZXZpb3VzPWN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICB9fSAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgZWxzZXsKICAgICAgICAgZm9yKGo9YjtqPD1hO2orKyl7IAogICAgICAgICAgIGZvcihrPWQ7azw9YztrKyspewogICAgICAgICAgICBjdXJyZW50PShQT0lOVCAqKW1hbGxvYyhzaXplb2YoUE9JTlQpKTtjdXJyZW50LT54PWo7Y3VycmVudC0+eT1rO3ByZXZpb3VzLT5uZXh0PWN1cnJlbnQ7Y3VycmVudC0+bmV4dD1OVUxMO3ByZXZpb3VzPWN1cnJlbnQ7fSAgCiAgICAgICAgICAgIH19CiAgICAgICAgICAgICB9CiAgICAgICBlPSgtMSkqU1RFUDsvKuaTtOW8teS6uueahOevhOWcje+8jOWIpOaWt+aYr+WQpuiiq+imhuiTiyovIAogICAgICAgZj1TVEVQOwogICAgICAgZm9yKGk9ZTtpPD1mO2krKyl7ICAvKuWIpOaWt+S6uuaJgOihjOevhOWcjeWFp++8jOaYr+WQpuW3suWFqOmDqOiiq+acqOS5g+S8iuimhuiTi++8jOeUqEZJTkTlsIvmib7pgqPlgIvpj4jntZDoo6HnmoTpu57luqfmqJnmmK/lkKbnrKblkIjvvIzmspLmib7liLDmnIMrMSovIAogICAgICAgICBmb3Ioaj1lO2o8PWY7aisrKXsKICAgICAgICAgICAgIGNoZWNrKz1maW5kKHBvaW50LGksaik7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfX0gICAgICAKICAgICAgICBTVEVQKys7LyrmraXmlbjkuIDlgLzlop7liqAqLyAgICAgICAgICAgICAgICAgICAKICAgICAgIAogICAgICAgaWYoKFNURVAtMSk+bWF4KXtmcHJpbnRmKHB0cjEsImNhc2UlZDpORVZFUiEhIixxKTticmVhazt9Ly/lpoLmnpzotoXpgY7mnIDlpKflgLzvvIzliYfmipPkuI3liLDvvIznnIvlsIjpoYzloLHlkYogCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgCiAgICAKIAogICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIGlmKChTVEVQLTEpPD1tYXgpey8v5aaC5p6c5LiN5pivbmV2ZXLvvIzliYfku6PooajmnIPooqvmipPliLAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB0bXA9U1RFUC0yOy8v5oiR5YCR6KaB5om+5Ye65YmN5LiA5q2l55qE5oOF5rOB77yM5Zug54K6U1RFUOW+gOS4iuWKoOacg+WkmuS4gOatpe+8jOaJgOS7pS0x54K65q2j56K65q2l5pW477yM5ZyoLTHmiY3mmK/liY3jhKfmraUgCiAgICAgICAgZnJlZShwb2ludCk7Ly/ph4vmlL7nr4Dpu57os4fmlpkKICAgICAgICBzMT0wOy8v6amF5YuV6K6K5pW4IAogICAgICAgIHMyPTA7CiAgICAgICAgczM9MDsKICAgICAgICBzND0wOyAgICAgICAgICAgICAgICAgICAKICAgICAgZm9yKGk9MDtpPE11bW15TnVtO2krKyl7CiAgICAgICAgYT1NeFtpXSt0bXA7Ly/miormr4/lgIvmnKjkuYPkvIrmiYDmk7TlvLXnmoTpnaLnqY3opobok4vvvIzliIbngrrkuIrkuIvlt6blj7MgCiAgICAgICAgYj1NeFtpXS10bXA7CiAgICAgICAgYz1NeVtpXSt0bXA7CiAgICAgICAgZD1NeVtpXS10bXA7CiAgICAgICAgCiAgICAgICAgIGlmKGk9PTApey8v5oqK5YmN5LiA5q2l6KKr6KaG6JOL5pmC55qE5omA5pyJ5bqn5qiZ5YSy5a2Y5oiQ6Y+I57WQIAogICAgICAgZm9yKGo9YjtqPD1hO2orKyl7IAogICAgICAgICAgZm9yKGs9ZDtrPD1jO2srKyl7CiAgICAgICAgICAgIGN1cnJlbnQ9KFBPSU5UICopbWFsbG9jKHNpemVvZihQT0lOVCkpO2N1cnJlbnQtPng9ajtjdXJyZW50LT55PWs7aWYoaj09YiYmaz09ZCl7cG9pbnQ9Y3VycmVudDtwcmV2aW91cz1jdXJyZW50O31lbHNle3ByZXZpb3VzLT5uZXh0PWN1cnJlbnQ7Y3VycmVudC0+bmV4dD1OVUxMO3ByZXZpb3VzPWN1cnJlbnQ7fQogICAgICAgICAgICAgICAgICAgICB9fSAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgZWxzZXsKICAgICAgICAgZm9yKGo9YjtqPD1hO2orKyl7IAogICAgICAgICAgIGZvcihrPWQ7azw9YztrKyspewogICAgICAgICAgICBjdXJyZW50PShQT0lOVCAqKW1hbGxvYyhzaXplb2YoUE9JTlQpKTtjdXJyZW50LT54PWo7Y3VycmVudC0+eT1rO3ByZXZpb3VzLT5uZXh0PWN1cnJlbnQ7Y3VycmVudC0+bmV4dD1OVUxMO3ByZXZpb3VzPWN1cnJlbnQ7fSAgCiAgICAgICAgICAgIH19CiAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIGU9KC0xKSoodG1wKTsvL+mAmeaZguaIkeWAkeimgeaJvuWHuumAmeOEp+atpe+8jOS9jee9rueCuuepuueahOWcsOaWuSAKICAgICBmPXRtcDsKICAgICBmb3IoaT1lO2k8PWY7aSsrKXtjdXJyZW50PXBvaW50O3MxKz1maW5kKGN1cnJlbnQsZixpKTtpZihzMSE9MCl7SHhbdG1wXT1mO0h5W3RtcF09aTticmVhazt9fSAvL+WmguaenOWFtuS4reaciem7nueCuuepuueahO+8jOaKiuWug+WtmOS4i+S+hu+8jOmblueEtuacieWPr+iDveaciTLlgIvku6XkuIogCiAgICAgZm9yKGk9ZTtpPD1mO2krKyl7Y3VycmVudD1wb2ludDtzMis9ZmluZChjdXJyZW50LGUsaSk7aWYoczIhPTApe0h4W3RtcF09ZTtIeVt0bXBdPWk7YnJlYWs7fX0vL+S4jemBjuWPqumcgOimgeS4gOWAi++8jOWboOatpOiiq+e9ruaPm+aOieaykuW3riAKICAgICBmb3IoaT1lO2k8PWY7aSsrKXtjdXJyZW50PXBvaW50O3MzKz1maW5kKGN1cnJlbnQsaSxmKTtpZihzMyE9MCl7SHhbdG1wXT1pO0h5W3RtcF09ZjticmVhazt9fQogICAgIGZvcihpPWU7aTw9ZjtpKyspe2N1cnJlbnQ9cG9pbnQ7czQrPWZpbmQoY3VycmVudCxpLGUpO2lmKHM0IT0wKXtIeFt0bXBdPWk7SHlbdG1wXT1lO2JyZWFrO319CiAgICAgCiAgICAgIAogICAgIAogICAgICAgICAKICAgICAvL+WBmuWujOS7peS4iu+8jOW3sue2k+W8hOWujOS4gOWAi+aDheazgeS6hiAgICAKICAgICAgICBmcHJpbnRmKHB0cjEsImNhc2UlZDolZCgwLDApIixxLFNURVAtMSk7Ly/ljbDlh7rmraXmlbggICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBjbG9zZSgwLDAsSHhbdG1wXSxIeVt0bXBdLHB0cjEpO30vL+aKiuWOn+m7nuacneiRl+aIkeWAkeWJm+WJm+aJvuWHuueCuuepuueahOS9jee9ruWJjemAsiAKICAgICAgICBmcHJpbnRmKHB0cjEsIlxuIik7CiAgICAgICAgcSsrOy8v5qyh5pW4KzEgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAKICAgICAgICAKICAgICAgICBmc2NhbmYocHRyLCIlZCIsJk11bW15TnVtKTsvL+mHjeikh+i3ke+8jOWmguaenOeCui0x77yM5b6A5LiL6LezICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAogICAgICAgICAgICAgIH0KCiAgICAgIGZwcmludGYocHRyMSwiVEhBTktTISFcbiIpOy8v57WQ5p2f56iL5byPICAKCgp9CgoKZmNsb3NlKHB0cik7Ly/pl5zmqpQgCmZjbG9zZShwdHIxKTsvL+mXnOaqlCAKICAgIAogICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgCiAgICAKICAgICAKICAKICAgIH0KCiAgICAKICAgIAogICAg