Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Двумерный массив

Ответить
Настройки темы
C/C++ - Двумерный массив

Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Delirium
Дата: 12-05-2013
Описание: Учимся использовать теги форматирования!
Доброго времени суток, товарищи программисты. Я учусь на программиста, и вот перед мной встала такова задача. Которую я не могу преодолеть.
Задача: Написать двумерный массив символьного типа из звездочек и точек, в рендомном порядке, и подсчитать количество звездочек в массиве. Условие: Если звездочки идут подряд, в рядке или строке то считать их как одну.
Я вот что наработал:
Код: Выделить весь код
#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 звездочки.

Отправлено: 16:32, 10-05-2013

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


Цитата vista54:
Думаю сделать что бы через условие, если идет подряд 2 звездочки, то считай как одну, и переписывай массив, до тех пор, когда массив совсем не упроситься. »
Подумай еще.
(без обид, без подколов, никакой задней мысли)
Такое решение возможно. Просто подумай еще. Может можно сделать проще.

----
Цитата vista54:
А есть еще идея удалять те которые идут подрят по одной.
Еще вот что с кодом придумал, но не знаю как его оформить правильно. »
Смысл идеи не ясен. Код не понятен. Верней даже не код, а его смысл. Просто какой-то набор команд. Напиши словами, зачем и для чего он нужен?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:45, 10-05-2013 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для deviance

Пользователь


Сообщения: 123
Благодарности: 43

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:10, 10-05-2013 | #3


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 22:12, 10-05-2013 | #4


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


А тут:
Код: Выделить весь код
******
*.****
******
?

Отправлено: 22:28, 10-05-2013 | #5


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


тут одна

Отправлено: 00:55, 11-05-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

Отправлено: 02:29, 11-05-2013 | #7


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:10, 11-05-2013 | #8


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата 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. Можно увидеть, что алгоритм не совсем оптимален — для «соседа» всегда будет проверяться его элемент-«сосед», с которого и «пришли» к данному элементу. Этого можно избежать, указывая дополнительно, с какого направления мы «пришли» к данному элементу. Но я не стал усложнять алгоритм, поскольку в данном случае сие малосущественно.

Последний раз редактировалось Iska, 11-05-2013 в 19:56. Причина: Подумал и добавил описание

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:31, 11-05-2013 | #9


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:39, 12-05-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Двумерный массив

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Помогите отсортировать двумерный массив (С++) Luda-tin Программирование и базы данных 4 15-05-2012 08:57
C/C++ - [решено] Помогите исправить (двумерный массив) на С++ Luda-tin Программирование и базы данных 2 13-05-2012 22:53
C/C++ - Двумерный массив feytan Программирование и базы данных 0 14-04-2011 00:58
C/C++ - Двумерный массив NAstyaT Программирование и базы данных 1 08-12-2010 00:38
C/C++ - [решено] Динамическая память под двумерный массив, где ошибка?) SeRgikON Программирование и базы данных 4 04-06-2010 18:31




 
Переход