Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
murderinc
1 / 1 / 0
Регистрация: 05.11.2008
Сообщений: 9
#1

обход массива рендом. - C++

04.07.2009, 12:51. Просмотров 1306. Ответов 12
Метки нет (Все метки)

Дан массив 10 на 10. Рендом выбираем точку, сравниваем элемент... Затем нужно опять выбирать рендом элемент, но так что бы не выбирать тот, который уже брали. Как можно запомнить, что выбирали уже, а что нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2009, 12:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос обход массива рендом. (C++):

Обход двумерного массива - C++
Сап, нужна помощь Образовать два одномерных массива путем перезаписи в них элементов из заданного целочисленного двумерного...

Обход массива по указателю - C++
Доброго времени суток. К примеру, у меня есть такой код: #include <iostream> using namespace std; int main() { int mass; ...

Обход массива рекурсией - C++
Вот написал обход с помощью цикла. Как обойти массив с помощью рекурсии? int Size(set *a) { set *it; int i = 0; if(first ==...

Рекурсивный обход двумерного массива - C++
Здравствуйте! Не могу составить алгоритм рекурсивного обхода двумерного массива. Например есть массив: 1 2 2 0 1 1 1 2 2 , выбираем...

Почему не работает обход массива? - C++
Что я делаю не так? int **mas = new int*; for (int i=0; i<5; i++) { for (int j=0; j<5; j++) { mas=new int(i+j); ...

Организовать обход массива по заданной схеме - C++
Добрый день. такое вот задание : 1. Заполнить значения элементов, чтобы они образовали циклический односвязный список в соответствии с...

12
HIMen
4154 / 1403 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
04.07.2009, 12:57 #2
Я бы создал еще одни массив 10х10 например bool и отмечал бы в нем использованные элементы.
Или создать класс с полями "элемент массива" и "использованность" и делать массив из этого класса
0
mamedovvms
2918 / 839 / 93
Регистрация: 30.04.2009
Сообщений: 2,633
04.07.2009, 12:57 #3
для этого тебе надо создать еще один массив например x 2x100 вот ту да и заносишь координаты того элемента который выбрал. а при последующем выборе проверяешь есть ли такие координаты, если есть то еще раз выбираешь
0
murderinc
1 / 1 / 0
Регистрация: 05.11.2008
Сообщений: 9
04.07.2009, 13:10  [ТС] #4
C++
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
#include <iostream.h>
#include <stdio.h>
#include <time.h>
#include <cstdlib>
void main(void) 
{
int i,j,mas1[10][10];
for(i=0;i<10;i++)
for(j=0;j<10;j++)
mas1[i][j]=0;
srand(static_cast<unsigned>(time(NULL)));
i=rand()%10;
j=rand()%10;
if (mas1[i][j]==0)
 mas1[i][j]=9;
 else if (mas1[i][j]==2)
 mas1[i][j]=0;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<<mas1[i][j];
}
cout<<endl;
}
}
вот например я создал матрицу, все нули, оно рендомовски выбирает элемент сравнивает с 0, естественно у нас 0 и заменяет на 9-ть, как мне записать это во второй массив, что имено этот элемент выбран ?
0
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
04.07.2009, 14:49 #5
Цитата Сообщение от mamedovvms Посмотреть сообщение
для этого тебе надо создать еще один массив например x 2x100 вот ту да и заносишь координаты того элемента который выбрал. а при последующем выборе проверяешь есть ли такие координаты, если есть то еще раз выбираешь
Каждый раз обходить весь массив?... не эффективно... HIMen правильно сказал. Вот мой вариант:
C++
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
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <cstdlib>
using namespace std;
 
void main() {
    int mas1[10][10], check[10][10], x, y;
    memset(mas1, 0, sizeof(mas1));
    memset(check, 0, sizeof(check));
    srand(time(NULL));
    for (int i = 0; i < 10; i++){
        for (int j = 0; j < 10; j++){
            x = rand()%10;
            y = rand()%10;
            while (check[x][y] != 0){
                x=rand()%10;
                y=rand()%10;
            }
            check[x][y] = 1;
            if (mas1[x][y]==0){
                mas1[x][y]=9;
            }else if (mas1[x][y]==2){
                mas1[x][y]=0;
            }
        }
    }
    for(int i = 0; i < 10; i++){
        for(int j = 0; j < 10; j++){
            cout << mas1[i][j] << ' ';
        }
        cout << endl;
    }
}
0
murderinc
1 / 1 / 0
Регистрация: 05.11.2008
Сообщений: 9
04.07.2009, 17:11  [ТС] #6
а если я хочу например масив заполнить не нулевые елементами.

вообщем суть все гараздо хуже. я хочу написать программу, которая будет брать массив с уже заполнеными цифрами, брать рендомовскую координату. потом сравнивать если это 2, то взять еще одну координату. рядом если опять 2, то очертить эти 2 клетки нулями.

то есть как морской бой. там цифры 4 3 2 1, 4444 - подряд стоят, 333 подряд стоят, а пустое поле заполнено нулями. и вот рендом выбирает, если попал в 1 значит меняет на *, если попал два раза в рядом стоящую 2-йку значит меняет их на **и так все корабли найти.

то есть примерно такая матрица

0 0 0 0 0 0 0 0 0 0
0 4 0 0 0 3 0 0 0 0
0 4 0 0 0 3 0 0 1 0
0 4 0 0 0 3 0 0 0 0
0 4 0 2 0 0 0 0 0 0
0 0 0 2 0 0 2 2 0 0
0 0 0 0 0 0 0 0 0 0
0 3 3 3 0 0 0 0 0 0
0 0 0 0 0 0 2 2 0 1
0 1 0 1 0 0 0 0 0 0

Добавлено через 11 минут 57 секунд
0 0 0 0 0 0 0 0 0 0
0 4 0 0 0 3 0 0 0 0
0 4 0 0 0 3 0 0 1 0
0 4 0 0 0 3 0 0 0 0
0 4 0 2 0 0 0 0 0 0
0 0 0 2 0 0 2 2 0 0
0 0 0 0 0 0 0 0 0 0
0 3 3 3 0 0 0 0 0 0
0 0 0 0 0 0 2 2 0 1
0 1 0 1 0 0 0 0 0 0


а потом например рендомом попал в 4 заменил на *, значит еще раз искать например i+1, j, еще раз попал в 4 заменил на *, и еще раз, и того все 4 найдены, все звездочки, значит заменить вокруг них стояшие нули тоже на *.

0 0 0 0 0 0 0 0 0 0
0 * 0 0 0 3 0 0 0 0
0 * 0 0 0 3 0 0 1 0
0 4 0 0 0 3 0 0 0 0
0 4 0 2 0 0 0 0 0 0
0 0 0 2 0 0 2 2 0 0
0 0 0 0 0 0 0 0 0 0
0 3 3 3 0 0 0 0 0 0
0 0 0 0 0 0 2 2 0 1
0 1 0 1 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0
* * * 0 0 3 0 0 0 0
* * * 0 0 3 0 0 1 0
* * * 0 0 3 0 0 0 0
* * * 2 0 0 0 0 0 0
0 0 0 2 0 0 2 2 0 0
0 0 0 0 0 0 0 0 0 0
0 3 3 3 0 0 0 0 0 0
0 0 0 0 0 0 2 2 0 1
0 1 0 1 0 0 0 0 0 0
и заменив на звезды больше не проверять эти элементы.
0
murderinc
1 / 1 / 0
Регистрация: 05.11.2008
Сообщений: 9
05.07.2009, 18:06  [ТС] #7
C++
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
for(;;){
                    i=rand()%10;
                    j=rand()%10;
                    if(mas1[i][j]!=7)
          break;
    }
for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            if(mas1[i][j]==1){
    if((mas1[i+1][j]!=1) && (mas1[i+1][j]==0 || mas1[i+1][j]==5))
            if(i<9){
        mas1[i+1][j]=8;
            }
        if((mas1[i-1][j]!=1) && (mas1[i-1][j]==0 || mas1[i-1][j]==5))
            if(i>0){
        mas1[i-1][j]=8;
            }
        if((mas1[i][j-1]!=1) && (mas1[i][j-1]==0 || mas1[i][j-1]==5))
            if(j>0){
        mas1[i][j-1]=8;
            }
        if((mas1[i][j+1]!=1) && (mas1[i][j+1]==0 || mas1[i][j+1]==5))
            if(j<9){
        mas1[i][j+1]=8;
            }
            if(mas1[i-1][j]==8 && mas1[i][j-1]==8 && mas1[i+1][j+1]!=1)
            if(i!=1 && j!=0){
            mas1[i-1][j-1]=8;
            }
            if(mas1[i+1][j]==8 && mas1[i][j+1]==8 && mas1[i-1][j-1]!=1)
            if(i!=8 && j!=9){
            mas1[i+1][j+1]=8;
            }
            if(mas1[i-1][j]==8 && mas1[i][j+1]==8 && mas1[i-1][j+1]!=1){
            mas1[i-1][j+1]=8;
            }
            if(mas1[i+1][j]==8 && mas1[i][j-1]==8 && mas1[i+1][j-1]!=1){
            mas1[i+1][j-1]=8;
            }
            }
    
            for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            if(mas1[i][j]==8 || mas1[i][j]==5 ){
                mas1[i][j]=7;
            }
так он обрисует 7-ками все единчки по кругу.

суть в том, что нужен цикл который бы проверял если это 1 2 3 4 или 0, рендомовски. и останавливался если нашел, а если попал в 7(помечается что уже тут был) то искать еще раз.

если нашел 0 заменить на 7мь.и остановится
если нашел 7 искать дальше,
если нашел 1 заменить на 7 и все вокруг на 7
если нашел 2 заменить на 7 и поднятся по горизонтали или вертикали влево право проверить, если 7 искать дальше если 0 поставить 7 остановится, если 2 заменить на 7мь и обрисовать вокруг 7ками
0
TanT
эволюционирую потихоньку
467 / 465 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
05.07.2009, 20:32 #8
А может обнести поле покругу ещё нулями. получиться массив побольше, зато проверки на выход за границы поля поменьше будут. Объясняю зачем: Я просто пока попытался рандомом расставить корабли и наткнулся на проблемму проверки выхода за границы. Корабли же кормой к друг другу жаться не должны? То есть нужно акваторию вокруг прошерстить, а когда корабль стоит к берегу в плотную это не удобно.
0
murderinc
1 / 1 / 0
Регистрация: 05.11.2008
Сообщений: 9
06.07.2009, 01:07  [ТС] #9
У меня есть процидура расстановки караблей все гуд работает, нада теперь обстрел их с учем что 4хтрубник это 4444, 3-х - 333, 2х-22, 1- 1, рендом берется первая координа, а дальше если попал в 4 иди 3 2 1 срелять еще, и стрелять i j+, находить корбаль.
так же там все будет с сервером работать, но пока интересует лучшая процедура, обстрела караблей.
0
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.07.2009, 05:30 #10
Вот для такого случая я специально берёг два алгоритма,которые мне когда-то выложили на одном форуме.Я их для истории сохранил )
Уже не помню,работают ли оба корректно,но задача обоих была такова - есть 54 карты в колоде карт,необходимо заполнить массив случайными числами,каждое из которых впоследствии будет индексом для карты в колоде Вот этот мне больше всего понравился,ибо оригинально сделан,на мой взгляд:
Довольно оригинальный
C++
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
#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[])
 
{
       int koloda[54] ;
        int prom[54];
 
        srand((unsigned)time( NULL ) );
 
        for (int i=0;i<54;i++)
       {
 
             int k=((rand()%(54-i)));
             int j=0;
 
             while ((j<=(i-1))&&(prom[j]<=k))
             {
                 k=k+1;
                 j=j+1;
             }
            koloda[ i ] = k ;
 
            while (j<=i)
            {
                  int a=prom[j];
 
                  prom[j]=k;
                  k=a;
                  j=j+1;
            }
       }
 
        for (int i=0;i<54;i++)
             cout<<koloda[i]<<" ";
 
        cin.get();
        return 0;
}

Ну и ещё один:
Ещё один,с bool массивом
C++
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
#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[])
 
{
       srand((unsigned)time( NULL ) );
        bool p[54];
        for(int j=0;j<54;j++)
            p[j]=false;
 
        int Cards[54];
 
        for(int i=0;i<54;i++)
        {
              int k=((rand()%(54)));
 
              while(p[k]==true)
              {
                     k=((rand()%(54)));
                      cout<<".";
              }
              p[k]=true;
 
              Cards[i]=k;cout<<Cards[i]<<" ";
        }
 
        cin.get();
        return 0;
}

Тут как раз используется массив bool
0
TanT
эволюционирую потихоньку
467 / 465 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
06.07.2009, 14:12 #11
Мой вариант с расстановкой и стрельбой, чувствую корявый, но выложу на суд
0
Вложения
Тип файла: txt SeaWar.txt (6.9 Кб, 26 просмотров)
hockfan
7 / 7 / 0
Регистрация: 08.07.2009
Сообщений: 13
08.07.2009, 10:24 #12
Если я правильно понял задачу:

Созданный массив отсортируй по Рэндому и дальше уже просто выбирай обычным порядком. Точно все будет рэндом и точно не повторишь элемент без всяких крутых алгоритмов.
0
Alex M
4 / 4 / 1
Регистрация: 12.07.2009
Сообщений: 18
14.07.2009, 16:18 #13
delete
delete
0
14.07.2009, 16:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2009, 16:18
Привет! Вот еще темы с ответами:

Разница между понятиями "Обход в прямом направлении" и "Итерационный прямой обход" - C++
Ребятаа, обьясните чем различается: Обход в прямом направлении и Итерационный прямой обход Добавлено через 10 минут НароооД,...

обход - C++
Король шахматной доски решил выяснить боеспособность своей армии. Посыльный объехал все клетки поля и сделал записи обо всех войсках,...

обход контейнеров - C++
Всем привет. Можно ли как-нибудь написать цикл фор под два контейнера для полученя доступа к Data ? class Data { public: int...

Обратный обход - C++
У меня есть реализация дерева и его прямой и симметричный обход. Как можно реализовать обратный обход? #include &quot;stdafx.h&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.