1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
program Suche_2D;
{$APPTYPE CONSOLE}
uses
SysUtils;
const n=3;
m=3;
type Matrix=array[1..n,1..m] of integer;
ergebnis=array[1..2] of integer;
function binsearch_dim2 (Folge: Matrix; n,m:integer;key:byte):ergebnis;
var i,mitte_spalte,links,rechts,Zeile:integer;
gefunden,Fehler:boolean;
merke:array of boolean;
begin
Setlength(merke,n);
gefunden := false;
Fehler:=false;
Zeile:= n div 2;
rechts:= m;
links := 1;
for i:=1 to n do merke[i]:=false;
while not gefunden and not Fehler do
begin
merke[Zeile]:=true;
while (links <= rechts) and not gefunden do
begin
mitte_spalte:= (rechts + links) div 2;
if Folge[zeile,mitte_spalte] > key then rechts:=mitte_spalte-1
else if Folge[Zeile,mitte_spalte] = key then gefunden:=true
else links:=mitte_spalte+1;
end;
if not gefunden and (links = 1) then
begin
Dec(Zeile);
if (merke[Zeile] <> true) and (Zeile >= 1) then rechts:=m
else Fehler:=true;
end
else if not gefunden and (rechts = m) then
begin
Inc(Zeile);
if (merke[Zeile] <> true) and (Zeile <= n) then links:=1
else Fehler:=true;
end;
end;
merke:=nil;
if not Fehler and gefunden then
begin
result[1]:=Zeile;
result[2]:=mitte_spalte;
end
else result[1]:=0;
end;
var a:Matrix;
begin
//Test
a[1,1]:=1;
a[1,2]:=2;
a[1,3]:=3;
a[2,1]:=4;
a[2,2]:=5;
a[2,3]:=6;
a[3,1]:=7;
a[3,2]:=8;
a[3,3]:=9;
write(binsearch_dim2(a,n,m,8 )[1],' ',binsearch_dim2(a,n,m,8 )[2]);
readln;
end.
|