Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Двумерный массив (http://forum.oszone.net/showthread.php?t=260297)

vista54 10-05-2013 16:32 2147653

Двумерный массив
 
Доброго времени суток, товарищи программисты. Я учусь на программиста, и вот перед мной встала такова задача. Которую я не могу преодолеть.
Задача: Написать двумерный массив символьного типа из звездочек и точек, в рендомном порядке, и подсчитать количество звездочек в массиве. Условие: Если звездочки идут подряд, в рядке или строке то считать их как одну.
Я вот что наработал:
Код:

#include <iostream>
#include <time.h>
using namespace std;

void main()
{
char a[20][20];
int n;
srand(time(NULL));
for (int i=0;i<20; i++)
{
for(int j=0; j<20; j++)
{
n=rand()%2;
if (n==1) a[i][j]='.'; else a[i][j]='*';
cout<<a[i][j];
}
cout<<endl;
}
}

Выводиться двумерный массив, из звездочек и точек.
Дальше проблема.
Думаю сделать что бы через условие, если идет подряд 2 звездочки, то считай как одну, и переписывай массив, до тех пор, когда массив совсем не упроситься.

А есть еще идея удалять те которые идут подрят по одной.

Еще вот что с кодом придумал, но не знаю как его оформить правильно. Буду заранее благодарен!!!
Код:

сhar temp[20] = a[1];
int stars = 0;
bool on_star = false;
for (i=0;i<20;i++)
if (temp[i] == '*' && !on_star){stars++;
on_star = true;}

if (temp[i] == '.'
on_star = false;

Пример работы програмы
.***...
**..**.
тут 2 звездочки.

lxa85 10-05-2013 16:45 2147658

Цитата:

Цитата vista54
Думаю сделать что бы через условие, если идет подряд 2 звездочки, то считай как одну, и переписывай массив, до тех пор, когда массив совсем не упроситься. »

Подумай еще.
(без обид, без подколов, никакой задней мысли)
Такое решение возможно. Просто подумай еще. Может можно сделать проще.

----
Цитата:

Цитата vista54
А есть еще идея удалять те которые идут подрят по одной.
Еще вот что с кодом придумал, но не знаю как его оформить правильно. »

Смысл идеи не ясен. Код не понятен. Верней даже не код, а его смысл. Просто какой-то набор команд. Напиши словами, зачем и для чего он нужен?

deviance 10-05-2013 17:10 2147666

vista54,
Цитата:

Цитата vista54
Условие: Если звездочки идут подряд »

Цитата:

Цитата vista54
Думаю сделать что бы через условие, если идет подряд 2 звездочки, то считай как одну, »

А если три, четыре подряд?

vista54 10-05-2013 22:12 2147792

lxa85
Необходимо написать массив, с звездочек и точек, размер 200 на 200. Посчитать количество звездочек. Если звездочки идут подряд, хоть в ряду, хоть в столбе, то считать их как одну.

Пример работы программы:
0**000
0*0**0
000*00

тут 2 звездочки.

Iska 10-05-2013 22:28 2147809

А тут:
Код:

******
*.****
******

?

vista54 11-05-2013 00:55 2147862

тут одна

Iska 11-05-2013 02:29 2147876

Мне что-то в голову ничего не приходит окромя рекурсивного перебора.

vista54 11-05-2013 16:10 2148098

Iska, пример кода хотябы напиши)

Iska 11-05-2013 19:31 2148222

Цитата:

Цитата vista54
Iska, пример кода хотябы напиши) »

Держите:
читать дальше »
Код:

Option Explicit

Const strStar      = "█"
Const strDot        = "░"
Const strFoundStar  = "◘"

Dim arrMatrix(3, 6)

Dim lngCount
Dim intTab

Dim i, j


FillRandom arrMatrix

DisplayArray arrMatrix

lngCount = 0
intTab = 0

For i = LBound(arrMatrix, 1) To UBound(arrMatrix, 1)
        For j = LBound(arrMatrix, 2) To UBound(arrMatrix, 2)
                If arrMatrix(i, j) = strStar Then
                        lngCount = lngCount + 1
                       
                        'WScript.StdOut.WriteLine lngCount
                        'WScript.StdOut.WriteLine String(UBound(arrMatrix, 2) + 1,"-")
                        'DisplayArray arrMatrix
                        'WScript.StdOut.WriteLine String(UBound(arrMatrix, 2) + 1,"-")
                       
                        Recurse i, j
                End If
        Next
       
        'WScript.StdOut.WriteLine
Next

WScript.StdOut.WriteLine
WScript.StdOut.WriteLine "Found " & lngCount & " continues of [" & strStar & "]."

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub Recurse(i, j)
        arrMatrix(i, j) = strFoundStar
        intTab = intTab + 1
       
        'DisplayArray arrMatrix
       
        If i - 1 >= LBound(arrMatrix, 1) Then
                If arrMatrix(i - 1, j) = strStar Then
                        Recurse i - 1, j
                End If
        End If
       
        If j - 1 >= LBound(arrMatrix, 2) Then
                If arrMatrix(i, j - 1) = strStar Then
                        Recurse i, j - 1
                End If
        End If
       
        If i + 1 <= UBound(arrMatrix, 1) Then
                If arrMatrix(i + 1, j) = strStar Then
                        Recurse i + 1, j
                End If
        End If
       
        If j + 1 <= UBound(arrMatrix, 2) Then
                If arrMatrix(i, j + 1) = strStar Then
                        Recurse i, j + 1
                End If
        End If
       
        intTab = intTab - 1
End Sub
'=============================================================================

'=============================================================================
Sub DisplayArray(arrMatrix())
        Dim i, j
       
        For i = LBound(arrMatrix, 1) To UBound(arrMatrix, 1)
                WScript.StdOut.Write Space(intTab * 4)
               
                For j = LBound(arrMatrix, 2) To UBound(arrMatrix, 2)
                        WScript.StdOut.Write arrMatrix(i, j)
                Next
               
                WScript.StdOut.WriteLine
        Next
End Sub
'=============================================================================

'=============================================================================
Sub FillRandom(arrMatrix())
        Dim i, j
       
        Randomize Timer
       
        For i = LBound(arrMatrix, 1) To UBound(arrMatrix, 1)
                For j = LBound(arrMatrix, 2) To UBound(arrMatrix, 2)
                        If Rnd() - 0.5 > 0 Then
                                arrMatrix(i, j) = strStar
                        Else
                                arrMatrix(i, j) = strDot
                        End If
                Next
        Next
End Sub
'=============================================================================

Один из возможных результатов…
Код:

░█░██░░
░█░█░██
██░░██░
█░░█░░█

Found 5 continues of [█].


Это скрипт на WSH, исполнение только под консолью; перевод за Вами ;). Если хотите посмотреть шаги:
читать дальше »
Код:

░█░██░░
░█░█░██
██░░██░
█░░█░░█
1
-------
░█░██░░
░█░█░██
██░░██░
█░░█░░█
-------
    ░◘░██░░
    ░█░█░██
    ██░░██░
    █░░█░░█
        ░◘░██░░
        ░◘░█░██
        ██░░██░
        █░░█░░█
            ░◘░██░░
            ░◘░█░██
            █◘░░██░
            █░░█░░█
                ░◘░██░░
                ░◘░█░██
                ◘◘░░██░
                █░░█░░█
                    ░◘░██░░
                    ░◘░█░██
                    ◘◘░░██░
                    ◘░░█░░█
2
-------
░◘░██░░
░◘░█░██
◘◘░░██░
◘░░█░░█
-------
    ░◘░◘█░░
    ░◘░█░██
    ◘◘░░██░
    ◘░░█░░█
        ░◘░◘█░░
        ░◘░◘░██
        ◘◘░░██░
        ◘░░█░░█
        ░◘░◘◘░░
        ░◘░◘░██
        ◘◘░░██░
        ◘░░█░░█

3
-------
░◘░◘◘░░
░◘░◘░██
◘◘░░██░
◘░░█░░█
-------
    ░◘░◘◘░░
    ░◘░◘░◘█
    ◘◘░░██░
    ◘░░█░░█
        ░◘░◘◘░░
        ░◘░◘░◘█
        ◘◘░░█◘░
        ◘░░█░░█
            ░◘░◘◘░░
            ░◘░◘░◘█
            ◘◘░░◘◘░
            ◘░░█░░█
        ░◘░◘◘░░
        ░◘░◘░◘◘
        ◘◘░░◘◘░
        ◘░░█░░█


4
-------
░◘░◘◘░░
░◘░◘░◘◘
◘◘░░◘◘░
◘░░█░░█
-------
    ░◘░◘◘░░
    ░◘░◘░◘◘
    ◘◘░░◘◘░
    ◘░░◘░░█
5
-------
░◘░◘◘░░
░◘░◘░◘◘
◘◘░░◘◘░
◘░░◘░░█
-------
    ░◘░◘◘░░
    ░◘░◘░◘◘
    ◘◘░░◘◘░
    ◘░░◘░░◘


Found 5 continues of [█].


— раскомментируйте закомментированный вывод.

Алгоритм простой — движемся по массиву сверху вниз/слева направо. Найдя элемент с потребным содержимым, увеличиваем счётчик найденного и меняем содержимое элемента (дабы не учитывать его повторно), затем опрашиваем его «соседей» сверху, снизу, справа и слева. Если «сосед» также окажется элементом с потребным содержимым — вызываем аналогичную процедуру для него. Повторяем, пока не дойдём до конца массива.

P.S. Можно увидеть, что алгоритм не совсем оптимален — для «соседа» всегда будет проверяться его элемент-«сосед», с которого и «пришли» к данному элементу. Этого можно избежать, указывая дополнительно, с какого направления мы «пришли» к данному элементу. Но я не стал усложнять алгоритм, поскольку в данном случае сие малосущественно.

vista54 12-05-2013 23:39 2148963

Омг) я первокурсник) я не переведу такое:(

lxa85 13-05-2013 00:09 2148999

vista54, Вам всего то надо перевести функцию рекурсии. Остальное - "обвеска".
Цитата:

Цитата vista54
Омг) я первокурсник »

Ну и что? У нас первокурсники вполне с этим справляются. В профильных вообще в первый семестр упаковывают.

Iska 13-05-2013 05:22 2149079

Цитата:

Цитата vista54
я первокурсник) я не переведу такое »

vista54, и не надо. Достаточно сохранить в файл с расширением «.vbs», запустить командную строку, в ней набрать:
Код:

cscript.exe //nologo "Путь к сохранённому файлу\Имя.vbs"
посмотреть, что это работает и, собственно, как это работает, затем по описанному алгоритму написать своё приложение на C/C++. Что непонятно по коду VBScript — спрашивайте.

pva 13-05-2013 08:23 2149119

По ходу дела это flood fill http://ru.wikipedia.org/wiki/%D0%97%...B2%D0%BA%D0%B0

vista54 13-05-2013 11:13 2149169

ладно приду с пар, попробую) Всем спасибо!


Время: 19:34.

Время: 19:34.
© OSzone.net 2001-