Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
murderinc
1 / 1 / 0
Регистрация: 05.11.2008
Сообщений: 9
04.07.2009, 12:51     обход массива рендом. #1
Дан массив 10 на 10. Рендом выбираем точку, сравниваем элемент... Затем нужно опять выбирать рендом элемент, но так что бы не выбирать тот, который уже брали. Как можно запомнить, что выбирали уже, а что нет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2009, 12:51     обход массива рендом.
Посмотрите здесь:

Обход матрицы C++
обход C++
Обход дерева) C++
C++ Рекурсивный обход двумерного массива
C++ Обход массива рекурсией
C++ Обход лабиринта
C++ Почему не работает обход массива?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HIMen
 Аватар для HIMen
4109 / 1358 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
04.07.2009, 12:57     обход массива рендом. #2
Я бы создал еще одни массив 10х10 например bool и отмечал бы в нем использованные элементы.
Или создать класс с полями "элемент массива" и "использованность" и делать массив из этого класса
mamedovvms
2915 / 836 / 93
Регистрация: 30.04.2009
Сообщений: 2,614
04.07.2009, 12:57     обход массива рендом. #3
для этого тебе надо создать еще один массив например x 2x100 вот ту да и заносишь координаты того элемента который выбрал. а при последующем выборе проверяешь есть ли такие координаты, если есть то еще раз выбираешь
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-ть, как мне записать это во второй массив, что имено этот элемент выбран ?
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;
    }
}
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
и заменив на звезды больше не проверять эти элементы.
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ками
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
05.07.2009, 20:32     обход массива рендом. #8
А может обнести поле покругу ещё нулями. получиться массив побольше, зато проверки на выход за границы поля поменьше будут. Объясняю зачем: Я просто пока попытался рандомом расставить корабли и наткнулся на проблемму проверки выхода за границы. Корабли же кормой к друг другу жаться не должны? То есть нужно акваторию вокруг прошерстить, а когда корабль стоит к берегу в плотную это не удобно.
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+, находить корбаль.
так же там все будет с сервером работать, но пока интересует лучшая процедура, обстрела караблей.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 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
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
06.07.2009, 14:12     обход массива рендом. #11
Мой вариант с расстановкой и стрельбой, чувствую корявый, но выложу на суд
Вложения
Тип файла: txt SeaWar.txt (6.9 Кб, 26 просмотров)
hockfan
 Аватар для hockfan
7 / 7 / 0
Регистрация: 08.07.2009
Сообщений: 13
08.07.2009, 10:24     обход массива рендом. #12
Если я правильно понял задачу:

Созданный массив отсортируй по Рэндому и дальше уже просто выбирай обычным порядком. Точно все будет рэндом и точно не повторишь элемент без всяких крутых алгоритмов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2009, 16:18     обход массива рендом.
Еще ссылки по теме:

Разница между понятиями "Обход в прямом направлении" и "Итерационный прямой обход" C++
C++ Обход в ширину
Обход массива C++
C++ Обход массива по указателю
Обход двумерного массива C++

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

Или воспользуйтесь поиском по форуму:
Alex M
4 / 4 / 1
Регистрация: 12.07.2009
Сообщений: 18
14.07.2009, 16:18     обход массива рендом. #13
delete
delete
Yandex
Объявления
14.07.2009, 16:18     обход массива рендом.
Ответ Создать тему
Опции темы

Текущее время: 17:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru