mrcnn
25-10-2006, 09:04
Задача следующая. Есть матрица размера mxn
Нужно отсортировать элементы матрицы и пройти ее по часовой стрелке от начала до центра, располагая в матрице отсортированные ее элементы.
Например, если дана матрица A(m,n) {a(i,j)-элементы} и m=n=3, то проход a(1,1) -> a(1,2) ->a(1,3) -> a(2,3) -> a(3,3) -> a(3,2) -> a(3,1) -> a(2,1) --> a(2,2)
Насколько эффективен будет следующий алгоритм обхода: сначала делаем поворот (с располаганием элементов) на 3 четверти, затем циклично до конца повороты на 2 четверти. Какие более эффективные алгоритмы можно использовать?
'Расположить элементы матрицы по часовой стрелке в возрастающем порядке
Dim a(),x(), sx,posy,posx,numx,numy,k,i,j,l,m,n,s, u, msg, msgst,msgp, nn,tmp
input()
msg=sort(x)
sx=split(msg,"~")
msgp=arr_to_string(sx,1)
msgst=arr_to_string(a,2)
u=0
l=0
numy=Ubound(a,1)
numx=Ubound(a,2)
posy=0
posx=0
i=0
''''''''''один поворот на 3 четверти'''''''''''''
For j=posx To numx
a(i,j)=eval(sx(l))
l=l+1
Next
j=j-1
numx=posx
posx=j
For i=posy+1 To numy
a(i,j)=eval(sx(l))
l=l+1
Next
i=i-1
numy=posy
posy=i
if m<>0 then
For j=posx-1 To numx Step -1
a(i,j)=eval(sx(l))
l=l+1
Next
j=j+1
numx=posx
posx=j
numy=numy+1
end if
'''''''''''следующие повороты на 2 четверти''''''''''
nn=1
while (l<Ubound(sx))
if ((nn Mod 2) <> 0) then
if nn>2 then numy=numy+1
For i=posy-1 To numy Step -1
a(i,j)=eval(sx(l))
l=l+1
Next
i=i+1
numy=posy
posy=i
For j=posx+1 To numx-1
a(i,j)=eval(sx(l))
l=l+1
Next
j=j-1
numx=posx
posx=j
nn=nn+1
else
For i=posy+1 To numy-1
a(i,j)=eval(sx(l))
l=l+1
Next
i=i-1
numy=posy
posy=i
if nn>1 then numx=numx+1
For j=posx-1 To numx Step -1
a(i,j)=eval(sx(l))
l=l+1
Next
j=j+1
numx=posx
posx=j
nn=nn+1
end if
wend
''''''''' Вывод матрицы '''''''''
msg = arr_to_string (a,2)
msgBox("Последовательность: "&vbcrlf& msgp&vbcrlf& _
"Начальная матрица: "&vbcrlf& msgst&vbcrlf&_
"Конечная матрица: "&vbcrlf& msg&vbcrlf)
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function sort (x())
Dim i,j,s
For i=0 To Ubound(x)-1
For j=i+1 To Ubound(x)
If (x(i)>x(j)) then
tmp=x(j)
x(j)=x(i)
x(i)=tmp
end if
next
next
s=join(x,"~")
sort=s
End Function
Sub input()
Dim k,i,j,t
k=0
m=inputbox("Размерность по y?")
while (not isnumeric(m) or isempty(m) or isnull(m) or m<0)
m=inputbox("Введено некорректное значение. Введите размерность по y")
wend
n=inputbox("Размерность по x?")
while (not isnumeric(n) or isempty(n) or isnull(n) or n<0)
n=inputbox("Введено некорректное значение. Введите размерность по x")
wend
Redim a(m,n)
For i=0 To Ubound(a,1)
For j=0 To Ubound(a,2)
t=inputbox("Введите a("&i&","&j&")")
while (not isnumeric(t) or isempty(t) or isnull(t))
t=inputbox("Введено некорректное значение. Введите a("&i&","&j&")")
wend
Redim Preserve x(k)
a(i,j)=t
x(k)=eval(a(i,j))
k=k+1
Next
Next
End Sub
Sub arr_print(p(), r)
Dim i,j
Select Case r
Case "1"
For i=0 To Ubound(p)
msgBox "p("&i&")/"&p(i)&"/"&vbcrlf
Next
Case "2"
For i=0 To Ubound(p,1)
For j=0 To Ubound(p,2)
msgBox "p("&i&","&j&")="&p(i,j)&vbcrlf
Next
Next
case else
MsgBox("Not supported")
End Select
End Sub
Function arr_to_string(p(), r)
Dim msg,i,j
msg=""
Select Case r
Case "1"
For i=0 To Ubound(p)
msg=msg & p(i) & " "
Next
msg=msg&vbcrlf
Case "2"
For i=0 To Ubound(p,1)
For j=0 To Ubound(p,2)
msg=msg & p(i,j) & " "
Next
msg=msg&vbcrlf
Next
case else
MsgBox("Not supported")
End Select
arr_to_string=msg
End Function
Главное, чтобы мне подобные задачи на экзамене или на зачете не попались, потому что за 2-3 часа написать нереально.
Нужно отсортировать элементы матрицы и пройти ее по часовой стрелке от начала до центра, располагая в матрице отсортированные ее элементы.
Например, если дана матрица A(m,n) {a(i,j)-элементы} и m=n=3, то проход a(1,1) -> a(1,2) ->a(1,3) -> a(2,3) -> a(3,3) -> a(3,2) -> a(3,1) -> a(2,1) --> a(2,2)
Насколько эффективен будет следующий алгоритм обхода: сначала делаем поворот (с располаганием элементов) на 3 четверти, затем циклично до конца повороты на 2 четверти. Какие более эффективные алгоритмы можно использовать?
'Расположить элементы матрицы по часовой стрелке в возрастающем порядке
Dim a(),x(), sx,posy,posx,numx,numy,k,i,j,l,m,n,s, u, msg, msgst,msgp, nn,tmp
input()
msg=sort(x)
sx=split(msg,"~")
msgp=arr_to_string(sx,1)
msgst=arr_to_string(a,2)
u=0
l=0
numy=Ubound(a,1)
numx=Ubound(a,2)
posy=0
posx=0
i=0
''''''''''один поворот на 3 четверти'''''''''''''
For j=posx To numx
a(i,j)=eval(sx(l))
l=l+1
Next
j=j-1
numx=posx
posx=j
For i=posy+1 To numy
a(i,j)=eval(sx(l))
l=l+1
Next
i=i-1
numy=posy
posy=i
if m<>0 then
For j=posx-1 To numx Step -1
a(i,j)=eval(sx(l))
l=l+1
Next
j=j+1
numx=posx
posx=j
numy=numy+1
end if
'''''''''''следующие повороты на 2 четверти''''''''''
nn=1
while (l<Ubound(sx))
if ((nn Mod 2) <> 0) then
if nn>2 then numy=numy+1
For i=posy-1 To numy Step -1
a(i,j)=eval(sx(l))
l=l+1
Next
i=i+1
numy=posy
posy=i
For j=posx+1 To numx-1
a(i,j)=eval(sx(l))
l=l+1
Next
j=j-1
numx=posx
posx=j
nn=nn+1
else
For i=posy+1 To numy-1
a(i,j)=eval(sx(l))
l=l+1
Next
i=i-1
numy=posy
posy=i
if nn>1 then numx=numx+1
For j=posx-1 To numx Step -1
a(i,j)=eval(sx(l))
l=l+1
Next
j=j+1
numx=posx
posx=j
nn=nn+1
end if
wend
''''''''' Вывод матрицы '''''''''
msg = arr_to_string (a,2)
msgBox("Последовательность: "&vbcrlf& msgp&vbcrlf& _
"Начальная матрица: "&vbcrlf& msgst&vbcrlf&_
"Конечная матрица: "&vbcrlf& msg&vbcrlf)
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function sort (x())
Dim i,j,s
For i=0 To Ubound(x)-1
For j=i+1 To Ubound(x)
If (x(i)>x(j)) then
tmp=x(j)
x(j)=x(i)
x(i)=tmp
end if
next
next
s=join(x,"~")
sort=s
End Function
Sub input()
Dim k,i,j,t
k=0
m=inputbox("Размерность по y?")
while (not isnumeric(m) or isempty(m) or isnull(m) or m<0)
m=inputbox("Введено некорректное значение. Введите размерность по y")
wend
n=inputbox("Размерность по x?")
while (not isnumeric(n) or isempty(n) or isnull(n) or n<0)
n=inputbox("Введено некорректное значение. Введите размерность по x")
wend
Redim a(m,n)
For i=0 To Ubound(a,1)
For j=0 To Ubound(a,2)
t=inputbox("Введите a("&i&","&j&")")
while (not isnumeric(t) or isempty(t) or isnull(t))
t=inputbox("Введено некорректное значение. Введите a("&i&","&j&")")
wend
Redim Preserve x(k)
a(i,j)=t
x(k)=eval(a(i,j))
k=k+1
Next
Next
End Sub
Sub arr_print(p(), r)
Dim i,j
Select Case r
Case "1"
For i=0 To Ubound(p)
msgBox "p("&i&")/"&p(i)&"/"&vbcrlf
Next
Case "2"
For i=0 To Ubound(p,1)
For j=0 To Ubound(p,2)
msgBox "p("&i&","&j&")="&p(i,j)&vbcrlf
Next
Next
case else
MsgBox("Not supported")
End Select
End Sub
Function arr_to_string(p(), r)
Dim msg,i,j
msg=""
Select Case r
Case "1"
For i=0 To Ubound(p)
msg=msg & p(i) & " "
Next
msg=msg&vbcrlf
Case "2"
For i=0 To Ubound(p,1)
For j=0 To Ubound(p,2)
msg=msg & p(i,j) & " "
Next
msg=msg&vbcrlf
Next
case else
MsgBox("Not supported")
End Select
arr_to_string=msg
End Function
Главное, чтобы мне подобные задачи на экзамене или на зачете не попались, потому что за 2-3 часа написать нереально.