<?php
$n
= 4;
function
findRing(
$arr
,
$x
)
{
global
$n
;
if
(
$arr
[0][0] >
$x
)
return
-1;
$l
= 0;
$r
= (int)((
$n
+ 1) / 2 - 1);
if
(
$n
% 2 == 1 &&
$arr
[
$r
][
$r
] <
$x
)
return
-1;
if
(
$n
% 2 == 0 &&
$arr
[
$r
+ 1][
$r
] <
$x
)
return
-1;
while
(
$l
<
$r
)
{
$mid
= (int)((
$l
+
$r
) / 2);
if
(
$arr
[
$mid
][
$mid
] <=
$x
)
if
(
$mid
== (int)((
$n
+ 1) / 2 - 1) ||
$arr
[
$mid
+ 1][
$mid
+ 1] >
$x
)
return
$mid
;
else
$l
=
$mid
+ 1;
else
$r
=
$mid
- 1;
}
return
$r
;
}
function
binarySearchRowInc(
$arr
,
$row
,
$l
,
$r
,
$x
)
{
while
(
$l
<=
$r
)
{
$mid
= (int)((
$l
+
$r
) / 2);
if
(
$arr
[
$row
][
$mid
] ==
$x
)
return
$mid
;
if
(
$arr
[
$row
][
$mid
] <
$x
)
$l
=
$mid
+ 1;
else
$r
=
$mid
- 1;
}
return
-1;
}
function
binarySearchColumnInc(
$arr
,
$col
,
$t
,
$b
,
$x
)
{
while
(
$t
<=
$b
)
{
$mid
= (int)((
$t
+ b) / 2);
if
(
$arr
[
$mid
][
$col
] ==
$x
)
return
$mid
;
if
(
$arr
[
$mid
][
$col
] <
$x
)
$t
=
$mid
+ 1;
else
$b
=
$mid
- 1;
}
return
-1;
}
function
binarySearchRowDec(
$arr
,
$row
,
$l
,
$r
,
$x
)
{
while
(
$l
<=
$r
)
{
$mid
= (int)((
$l
+
$r
) / 2);
if
(
$arr
[
$row
][
$mid
] ==
$x
)
return
$mid
;
if
(
$arr
[
$row
][
$mid
] <
$x
)
$r
=
$mid
- 1;
else
$l
=
$mid
+ 1;
}
return
-1;
}
function
binarySearchColumnDec(
$arr
,
$col
,
$t
,
$b
,
$x
)
{
while
(
$t
<=
$b
)
{
$mid
= (int)((
$t
+
$b
) / 2);
if
(
$arr
[
$mid
][
$col
] ==
$x
)
return
$mid
;
if
(
$arr
[
$mid
][
$col
] <
$x
)
$b
=
$mid
- 1;
else
$t
=
$mid
+ 1;
}
return
-1;
}
function
spiralBinary(
$arr
,
$x
)
{
global
$n
;
$f1
= findRing(
$arr
,
$x
);
$r
= -1;
$c
= -1;
if
(
$f1
== -1)
{
echo
"-1"
;
return
;
}
if
(
$n
% 2 == 1 &&
$f1
== (int)((
$n
+ 1) / 2 - 1))
{
echo
$f1
.
" "
.
$f1
.
"\n"
;
return
;
}
if
(
$x
<
$arr
[
$f1
][
$n
-
$f1
- 1])
{
$c
= binarySearchRowInc(
$arr
,
$f1
,
$f1
,
$n
-
$f1
- 2,
$x
);
$r
=
$f1
;
}
else
if
(
$x
<
$arr
[
$n
-
$f1
- 1][
$n
-
$f1
- 1])
{
$c
=
$n
-
$f1
- 1;
$r
= binarySearchColumnInc(
$arr
,
$n
-
$f1
- 1,
$f1
,
$n
-
$f1
- 2,
$x
);
}
else
if
(
$x
<
$arr
[
$n
-
$f1
- 1][
$f1
])
{
$c
= binarySearchRowDec(
$arr
,
$n
-
$f1
- 1,
$f1
+ 1,
$n
-
$f1
- 1,
$x
);
$r
=
$n
-
$f1
- 1;
}
else
{
$r
= binarySearchColumnDec(
$arr
,
$f1
,
$f1
+ 1,
$n
-
$f1
- 1,
$x
);
$c
=
$f1
;
}
if
(
$c
== -1 ||
$r
== -1)
echo
"-1"
;
else
echo
$r
.
" "
.
$c
;
return
;
}
$arr
=
array
(
array
( 1, 2, 3, 4 ),
array
( 12, 13, 14, 5 ),
array
( 11, 16, 15, 6 ),
array
( 10, 9, 8, 7 ));
spiralBinary(
$arr
, 7);
?>