Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 2
Регистрация: 05.11.2008
Сообщений: 9
1

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

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

Дан массив 10 на 10. Рендом выбираем точку, сравниваем элемент... Затем нужно опять выбирать рендом элемент, но так что бы не выбирать тот, который уже брали. Как можно запомнить, что выбирали уже, а что нет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2009, 12:51
Ответы с готовыми решениями:

Рендом в чейках
Здравствуйте, уважаемые программисты! Нужна Ваша помощь в реализации одного макроса. В книге...

рендом button не работает
Как сделать, чтобы кнопка появлялась рандомно. Написал так:void __fastcall...

Обход массива
Доброго времени суток всем. Суть в чем: есть функция, в которую подаются 2 переменные по ссылке....

обход массива
Привет.Подскажите пожалуйста,имеются подобные циклы,отличаются количеством элементов только:...

12
4304 / 1472 / 101
Регистрация: 12.04.2009
Сообщений: 2,346
04.07.2009, 12:57 2
Я бы создал еще одни массив 10х10 например bool и отмечал бы в нем использованные элементы.
Или создать класс с полями "элемент массива" и "использованность" и делать массив из этого класса
0
2920 / 841 / 324
Регистрация: 30.04.2009
Сообщений: 2,633
04.07.2009, 12:57 3
для этого тебе надо создать еще один массив например x 2x100 вот ту да и заносишь координаты того элемента который выбрал. а при последующем выборе проверяешь есть ли такие координаты, если есть то еще раз выбираешь
0
1 / 1 / 2
Регистрация: 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
692 / 383 / 51
Регистрация: 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
1 / 1 / 2
Регистрация: 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
1 / 1 / 2
Регистрация: 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
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
05.07.2009, 20:32 8
А может обнести поле покругу ещё нулями. получиться массив побольше, зато проверки на выход за границы поля поменьше будут. Объясняю зачем: Я просто пока попытался рандомом расставить корабли и наткнулся на проблемму проверки выхода за границы. Корабли же кормой к друг другу жаться не должны? То есть нужно акваторию вокруг прошерстить, а когда корабль стоит к берегу в плотную это не удобно.
0
1 / 1 / 2
Регистрация: 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
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
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
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
06.07.2009, 14:12 11
Мой вариант с расстановкой и стрельбой, чувствую корявый, но выложу на суд
0
Вложения
Тип файла: txt SeaWar.txt (6.9 Кб, 27 просмотров)
7 / 7 / 0
Регистрация: 08.07.2009
Сообщений: 13
08.07.2009, 10:24 12
Если я правильно понял задачу:

Созданный массив отсортируй по Рэндому и дальше уже просто выбирай обычным порядком. Точно все будет рэндом и точно не повторишь элемент без всяких крутых алгоритмов.
0
4 / 4 / 0
Регистрация: 12.07.2009
Сообщений: 18
14.07.2009, 16:18 13
delete
delete
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2009, 16:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Обход массива
Задана матрица, состоящая из текстбоксов и запоминается в виде двухмерного массива. Надо провести...

Рекурсивный обход. Не могу сделать табуляцию. Обход с выводом имен файлов
Задание простое, ну по крайней мере на первый взгляд. Написать скрипт обхода вложенных директорий с...

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

Итераторный обход массива
Здравствуйте. Снова вопрос. Нужно итераторным обходом обойти массив, и модули чисел, не превышающие...


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

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

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