Показать полную графическую версию : Двумерный массив
Доброго времени суток, товарищи программисты. Я учусь на программиста, и вот перед мной встала такова задача. Которую я не могу преодолеть.
Задача: Написать двумерный массив символьного типа из звездочек и точек, в рендомном порядке, и подсчитать количество звездочек в массиве. Условие: Если звездочки идут подряд, в рядке или строке то считать их как одну.
Я вот что наработал:
#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 звездочки.
Думаю сделать что бы через условие, если идет подряд 2 звездочки, то считай как одну, и переписывай массив, до тех пор, когда массив совсем не упроситься. »
Подумай еще.
(без обид, без подколов, никакой задней мысли)
Такое решение возможно. Просто подумай еще. Может можно сделать проще.
----
А есть еще идея удалять те которые идут подрят по одной.
Еще вот что с кодом придумал, но не знаю как его оформить правильно. »
Смысл идеи не ясен. Код не понятен. Верней даже не код, а его смысл. Просто какой-то набор команд. Напиши словами, зачем и для чего он нужен?
deviance
10-05-2013, 17:10
vista54, Условие: Если звездочки идут подряд »Думаю сделать что бы через условие, если идет подряд 2 звездочки, то считай как одну, »
А если три, четыре подряд?
lxa85
Необходимо написать массив, с звездочек и точек, размер 200 на 200. Посчитать количество звездочек. Если звездочки идут подряд, хоть в ряду, хоть в столбе, то считать их как одну.
Пример работы программы:
0**000
0*0**0
000*00
тут 2 звездочки.
А тут:
******
*.****
******
?
Мне что-то в голову ничего не приходит окромя рекурсивного перебора.
Iska, пример кода хотябы напиши)
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, Вам всего то надо перевести функцию рекурсии. Остальное - "обвеска".
Омг) я первокурсник »
Ну и что? У нас первокурсники вполне с этим справляются. В профильных вообще в первый семестр упаковывают.
я первокурсник) я не переведу такое »
vista54, и не надо. Достаточно сохранить в файл с расширением «.vbs», запустить командную строку, в ней набрать:
cscript.exe //nologo "Путь к сохранённому файлу\Имя.vbs"
посмотреть, что это работает и, собственно, как это работает, затем по описанному алгоритму написать своё приложение на C/C++. Что непонятно по коду VBScript — спрашивайте.
По ходу дела это flood fill http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BB%D0%B8%D0%B2%D0%BA%D0%B0
ладно приду с пар, попробую) Всем спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.