//C, 399 bytes
//BrainSteel
char*T
=" |-+ | +-| ",*B
;w
;f
(N
,x
,y
,m
,n
,F
,h
,k
,i
,j
){w
=B
?F
=0,w
:1<<N
|1;char b
[N
?w
*w
:6];for(k
=w
;k
--;)b
[k
*w
-1]=10;B
=!B
?F
=1,m
=0,n
=0,x
--,y
--,b
:B
;if(N
>1){h
=1<<N
-1;i
=x
>--h
,j
=y
>h
;while(++k
<4)if(k
%2-i
||k
/2-j
)f
(N
-1,!(k
%2)*h
,!(k
/2)*h
,m
+k
%2*(h
+1),n
+k
/2*(h
+1));f
(1,h
&i
,h
&j
,m
+h
,n
+h
);h
++;f
(N
-1,x
-h
*i
,y
-h
*j
,m
+h
*i
,n
+h
*j
);}else while(++k
<4)B
[w
*(n
+k
/2)+m
+k
%2]=T
[5*x
+2*y
+k
];if(F
)B
[y
*w
+x
]=79,B
[w
*w
-w
-1]=0,puts(N
?B
:"O"),B
=0;}
//Test program:
#include "stdio.h"
#include "string.h"
int main(){
int N, X, Y, Q = 0;
char buf[100];
while (!Q) {
//Input -1 X Y to quit
scanf(" %d %d %d", &N
, &X
, &Y
); if (N < 0) {
Q = 1;
}
else {
printf("%d %d %d\n\n", N
, X
, Y
); f(N, X, Y);
printf("\n--------------------------------\n\n"); }
}
return 0;
}
Ly9DLCAzOTkgYnl0ZXMKLy9CcmFpblN0ZWVsCgpjaGFyKlQ9IiB8LSsgfCArLXwgIiwqQjt3O2YoTix4LHksbSxuLEYsaCxrLGksail7dz1CP0Y9MCx3OjE8PE58MTtjaGFyIGJbTj93Knc6Nl07Zm9yKGs9dztrLS07KWJbayp3LTFdPTEwO0I9IUI/Rj0xLG09MCxuPTAseC0tLHktLSxiOkI7aWYoTj4xKXtoPTE8PE4tMTtpPXg+LS1oLGo9eT5oO3doaWxlKCsrazw0KWlmKGslMi1pfHxrLzItailmKE4tMSwhKGslMikqaCwhKGsvMikqaCxtK2slMiooaCsxKSxuK2svMiooaCsxKSk7ZigxLGgmaSxoJmosbStoLG4raCk7aCsrO2YoTi0xLHgtaCppLHktaCpqLG0raCppLG4raCpqKTt9ZWxzZSB3aGlsZSgrK2s8NClCW3cqKG4ray8yKSttK2slMl09VFs1KngrMip5K2tdO2lmKEYpQlt5KncreF09NzksQlt3Knctdy0xXT0wLHB1dHMoTj9COiJPIiksQj0wO30KCgovL1Rlc3QgcHJvZ3JhbToKI2luY2x1ZGUgInN0ZGlvLmgiCiNpbmNsdWRlICJzdHJpbmcuaCIKCmludCBtYWluKCl7CiAgICBpbnQgTiwgWCwgWSwgUSA9IDA7CiAgICBjaGFyIGJ1ZlsxMDBdOwogICAgCiAgICB3aGlsZSAoIVEpIHsKICAgIAkvL0lucHV0IC0xIFggWSB0byBxdWl0CiAgICAgICAgc2NhbmYoIiAlZCAlZCAlZCIsICZOLCAmWCwgJlkpOwogICAgICAgIGlmIChOIDwgMCkgewogICAgICAgICAgICBRID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByaW50ZigiJWQgJWQgJWRcblxuIiwgTiwgWCwgWSk7CiAgICAgICAgICAgIGYoTiwgWCwgWSk7CiAgICAgICAgICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoK