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

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

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

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

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

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

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

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

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

Обход массива рекурсией - 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); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HIMen
4125 / 1374 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
04.07.2009, 12:57     обход массива рендом. #2
Я бы создал еще одни массив 10х10 например bool и отмечал бы в нем использованные элементы.
Или создать класс с полями "элемент массива" и "использованность" и делать массив из этого класса
mamedovvms
2916 / 837 / 93
Регистрация: 30.04.2009
Сообщений: 2,624
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
эволюционирую потихоньку
465 / 463 / 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
Временно недоступен
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
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
06.07.2009, 14:12     обход массива рендом. #11
Мой вариант с расстановкой и стрельбой, чувствую корявый, но выложу на суд
Вложения
Тип файла: txt SeaWar.txt (6.9 Кб, 26 просмотров)
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++
Нужно составить программу ввода квадратной матрицы и печати в строку всех ее элементов в данном порядке обхода: 7 13 14 16 6 8 12 15 ...

Обход матрицы - C++
есть двумерная матрица 4х4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 ее рандомно перемешиваем. потом берем...


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

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

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