Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
6 / 1 / 0
Регистрация: 04.10.2013
Сообщений: 42

Рандомное перемещение фишек по квадратной матрице (клеточный автомат)

03.04.2014, 04:18. Показов 1808. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В квадратной таблице размера NxN в левом верх-нем и правом нижнем углу стоят фишки.
За одну секунду каждая фишка случайным образом смещается в одну из соседних клеток.
Фишки могут стоять на одной клетке, но не могут выходить за границу таблицы.
Требуется определить, сколько раз за K секунд фишки окажутся в одной клетке.
Прошу помощи по данной задачке.на бумаге представление имеется,но корявое...из за этого не могу вообще ничего накодить(((
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2014, 04:18
Ответы с готовыми решениями:

Клеточный автомат замкнутый в тор
Доброго времени суток, возникла проблема с написанием алгоритма для клеточного автомата. Вся проблема заключается в проверке соседей на...

Написать клеточный автомат Аква-тор
Нужно написать программу , клеточный автомат Аква-тор на С++, Visual Basic или C#. Кто может написать (за денюжку), помочь написать,...

Перемещение фишек
помогите мне пожалуйста, очень нужно, осталась одна задача до зачета. если что, есть вебмани. «Фишки» ...

10
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
03.04.2014, 10:12
Вот так:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <cstdlib>
#include <ctime>
 
#include <vector>
#include <iostream>
#include <algorithm>
 
typedef struct tagCoords
{
    int nRow;
    int nCol;
    int nCount;
    int nCheck;
} CHECK_COORDS;
 
const static int  N = 10;
const static long n_iterations = 100;
 
enum { mvForward = 0x01, mvBackward = 0x02 };
enum { mvHorizontal = 0x01, mvVertical = 0x02, mvDiagonal = 0x03 };
 
static long n_it = 0;
static short mv_path = mvForward;
static std::vector<CHECK_COORDS> vCheckCoords, vMatchCoords;
 
using namespace std;
 
void InitMatrix(vector< vector<int> >& Matrix)
{
    vector< vector<int> >::iterator 
        row_iterator = Matrix.begin();
    while (row_iterator != Matrix.end())
        (row_iterator++)->resize(N, 0);
 
    Matrix[0][0] = !Matrix[0][0];
    Matrix[N-1][N-1] = !Matrix[N-1][N-1];
}
 
void Display(int val) { std::cout << val << " "; }
int  MoveOrient() { return std::rand() % mvDiagonal + mvHorizontal; }
 
void UpdateView(vector< vector<int> >& Matrix)
{
    vector< vector<int> >::iterator 
        row_iterator = Matrix.begin();
    while (row_iterator != Matrix.end())
    {
        std::for_each(row_iterator->begin(), 
            row_iterator->end(), Display);
        std::cout << endl;
        row_iterator++;
    }
 
    std::cout << endl;
}
 
void MoveCheck(int row, int col, int check, 
    vector< vector<int> >& Matrix, vector<CHECK_COORDS>& CheckCoords)
{
    if (n_it >= n_iterations) return;
    if (row > N-1 && col <= N-1) row--;
    if (col > N-1 && row <= N-1) col--;
 
    if (row >= N-1 && col >= N-1 && mv_path == mvForward)
        mv_path = mvBackward;
    else if (row <= 0 && col <= 0 && mv_path == mvBackward) 
        mv_path = mvForward;
        
    Matrix[row][col] = !Matrix[row][col];
 
    std::cout << "row = " << row << " " << "col = " << 
        col << " " << "iteration = " << n_it+1 << endl << endl;
    if (mvHorizontal == MoveOrient() && row < N-1 && mv_path == mvForward) row++;
    else if (mvVertical == MoveOrient() && col < N-1 && mv_path == mvForward) col++;
    else if (mvDiagonal == MoveOrient() && row < N-1 && col < N-1 && mv_path == mvForward) { row++; col++; }
    else if (mvHorizontal == MoveOrient() && row > 0 && mv_path == mvBackward) row--;
    else if (mvVertical == MoveOrient() && col > 0 && mv_path == mvBackward) col--;
    else if (mvDiagonal == MoveOrient() && row > 0 && col > 0 && mv_path == mvBackward) { row--; col--; }
 
    bool bFound = false;
    vector<CHECK_COORDS>::iterator 
        coords_iterator = CheckCoords.begin();
    while (coords_iterator != CheckCoords.end() && !bFound)
    {
        if (coords_iterator->nRow == row && 
            coords_iterator->nCol == col && 
            coords_iterator->nCheck == check)
            { coords_iterator->nCount++; bFound = true; }
 
        coords_iterator++;
    }
 
    if (bFound == false)
    {
        CHECK_COORDS Coords;
        std::memset((void*)&Coords, 0x00, sizeof(CHECK_COORDS));
        Coords.nRow = row; Coords.nCol = col;
        Coords.nCheck = check; Coords.nCount = 1;
 
        CheckCoords.push_back(Coords);
    }
 
    Matrix[row][col] = !Matrix[row][col]; n_it++;
    UpdateView(Matrix); std::cin.get();
 
    MoveCheck(row, col, check, Matrix, CheckCoords);
}
 
int main(int argc, char** argv)
{
    vector< vector<int> > Matrix(N,0);
 
    std::srand((unsigned)std::time(NULL));
 
    InitMatrix(Matrix);
    UpdateView(Matrix);
 
    n_it = 0; 
    MoveCheck(0, 0, 0, Matrix, vCheckCoords);
    
    n_it = 0; 
    MoveCheck(N-1, N-1, 1, Matrix, vCheckCoords);
 
    vector<CHECK_COORDS>::iterator 
        coords_iterator = vCheckCoords.begin();
    while (coords_iterator != vCheckCoords.end())
    {
        long nVCount = 1;
        vector<CHECK_COORDS>::iterator 
            seek_iterator = coords_iterator;
        while (seek_iterator != vCheckCoords.end())
        {
            if (seek_iterator->nRow == coords_iterator->nRow &&
                seek_iterator->nCol == coords_iterator->nCol && 
                seek_iterator->nCheck == 1)
                nVCount = nVCount + 1;
 
            seek_iterator++;
        }
 
        CHECK_COORDS CheckCoords;
        std::memset((void*)&CheckCoords, 0x00, sizeof(CHECK_COORDS));
 
        CheckCoords.nRow = coords_iterator->nRow;
        CheckCoords.nCol = coords_iterator->nCol;
        CheckCoords.nCheck = 0; CheckCoords.nCount = nVCount;
 
        vMatchCoords.push_back(CheckCoords);
 
        std::cout << "row = " << coords_iterator->nRow << " " << 
                     "col = " << coords_iterator->nCol << " " <<
                     "check = " << coords_iterator->nCheck << " " <<
                     "count = " << coords_iterator->nCount << endl;
 
        coords_iterator++;
    }
 
    std::cout << endl << endl;
 
    long total = 0;
    vector<CHECK_COORDS>::const_iterator 
        match_iterator = vMatchCoords.begin();
    while (match_iterator != vMatchCoords.end())
    {
        std::cout << "row = " << match_iterator->nRow << " " << 
                     "col = " << match_iterator->nCol << " " <<
                     "count = " << match_iterator->nCount << endl;
        
        total+=match_iterator->nCount;
        match_iterator++;
    }
 
    std::cout << "\nTotal matches of both checks movement: " << total << endl << endl;
    cout << "\nPress any key to continue..." << endl; std::cin.get();
 
    return 0;
}
http://codepad.org/WAoGXcT6
Миниатюры
Рандомное перемещение фишек по квадратной матрице (клеточный автомат)  
Вложения
Тип файла: 7z output.7z (1.6 Кб, 3 просмотров)
Тип файла: 7z Test.7z (31.9 Кб, 5 просмотров)
2
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
03.04.2014, 10:24
1.) Таймера я не реализовал поскольку необходима установка boost. Вместо таймера используется переменная счетчик итераций n_it, n_iterations. Поэтому задача решается за n итераций, а не за n-секунд.)

2.) Есть также и другой метод решения этой статистической задачи: в матрице состоящей из нулей, в цикле, присваиваем элементу с выбранными случайно координатами row и col значение 1. Координаты записываются в таблицу аналогично решенной задаче. Далее снова обнуляем матрицу, и повторяем, описанную выше, операцию с новыми значениями координат. Данная процедура повторяется для каждой из фишек. Далее в таблице находим одинаковые координаты для обоих фишек, и подсчитываем их общее количество. Суть данного алгоритма заключается в том, что для определения количества элементов через которые проходят обои фишки не обязательно (!), чтобы они, в процессе работы программы, двигались по определенному пути. P.S. Будет время, выложу исходник.
1
6 / 1 / 0
Регистрация: 04.10.2013
Сообщений: 42
03.04.2014, 13:52  [ТС]
Эээээм...если честно я с первого раза маленько чуть не этоваш код может и хорош,но вот беда,мой уровень владения языком слишком мал. как нибудь попроще можно?Заранее благодарю

Добавлено через 3 минуты
ЭЭЭЭм...ваш код конечно сначала меня маленько испугал.Может даже он и хорош,но вот беда, мои навыки в языке слишком малы...нельзя и реализовать как нибудь проще?просто я если это преподавателю покажу, то либо меня осенило сразу на несколько уровней,либо преподу сон приснился
0
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
03.04.2014, 14:24
Посмотрим. Но не сейчас. Занят немного. Наверное завтра оба варианта.
2
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
04.04.2014, 10:57
Цитата Сообщение от Live4Sky Посмотреть сообщение
нельзя и реализовать как нибудь проще?
Вряд ли. Клеточные автоматы - нетривиальная задача. Поле может быть на тысячи клеток, в которых копошатся сотни "существ" (хищников, жертв). Без структур или классов не обойдешься.

Можно и картинку нарисовать.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <iostream>
#include <sstream>
#include <ctime>
#include <Windows.h>
 
HWND hW = GetConsoleWindow();
HDC hDC = GetDC(hW);
HANDLE hSTD = GetStdHandle(STD_INPUT_HANDLE); 
 
class Dot
{   
public:
    Dot();
    void SetDot (POINT*, POINT *,COLORREF);
    void CurToPrev ();
    POINT *GetPrev()    {   return coordPrev;}
    POINT *GetCur()     {   return coordCur; }
    COLORREF GetColor() {   return color;   }
    HBRUSH GetBrush()   {   return brush;   }
    void RandomMove (int);
    ~Dot();
 
private:
    POINT *coordPrev, *coordCur;
    COLORREF color;
    HBRUSH brush;
};
 
Dot::Dot ()
{   coordPrev = new POINT;
    coordCur = new POINT;
    coordPrev->x = coordPrev->y = 0;
    coordCur->x = coordCur->y = 0;
    color = RGB(0,0,0);
}
 
void Dot::SetDot (POINT *p0, POINT *p1, COLORREF c)
{   coordPrev->x = p0->x;
    coordPrev->y = p0->y;
    coordCur->x = p1->x;
    coordCur->y = p1->y;
    color = c;
    brush = CreateSolidBrush(c);
}
 
Dot::~Dot()
{   delete coordPrev;
    delete coordCur;
    DeleteObject(brush);
}
 
void Dot::CurToPrev()
{   coordPrev->x = coordCur->x;
    coordPrev->y = coordCur->y;
}
 
void Dot::RandomMove (int N)
{   int choice = rand() % 9;
    while (choice == 4 )
        choice = rand() % 9;
    int i = choice/3 - 1, j = choice%3 - 1; 
    
    coordCur->x = coordPrev->x + j;
    coordCur->y = coordPrev->y + i;
 
    if (coordCur->x < 0)    coordCur->x ++;
    if (coordCur->y < 0)    coordCur->y ++;
    if (coordCur->x > N-1)  coordCur->x --;
    if (coordCur->y > N-1)  coordCur->y --;
}
 
Dot **CreateArray (int M)
{   Dot **dots = new Dot*[M];
    for (int i = 0; i<M; i++)
        dots[i] = new Dot;
    return dots;
}
 
void DeleteArray (Dot **dots, int M)
{   for (int i = 0; i<M; i++)
        delete dots[i];
    delete [] dots;
}
 
void NextMove (Dot **dots, int M, int N)
{   for (int i = 0; i<M; i++)
    {   dots[i]->CurToPrev();
        dots[i]->RandomMove(N);
    }   
}
 
bool Meeting (Dot *d1, Dot *d2)
{   return (d1->GetCur()->x == d2->GetCur()->x && d1->GetCur()->y == d2->GetCur()->y);
}
 
void SetField (int N, int h)
{   int i, j;
    int x0 = 20, y0 = 80;
    HBRUSH  blueBrush = CreateSolidBrush(RGB(0,0,255)),\
            blackBrush = CreateSolidBrush(RGB(0,0,0));
    
    SelectObject(hDC, blueBrush);
    Rectangle(hDC, x0-1, y0-1, x0+N*h+2, y0+N*h+2);
    DeleteObject(blueBrush);
        
    SelectObject(hDC, blackBrush);
    for(i = 0; i<N; i++)
        for(j = 0; j<N; j++)
            Rectangle(hDC, x0+j*h+1, y0+i*h+1, x0+(j+1)*h, y0+(i+1)*h);
    DeleteObject(blackBrush);
}
 
void ShowPicture (int step, int meet, Dot **dots, int M, int N, int h)
{   int x0 = 20, y0 = 80, x, y, i;
    std::string num;
    std::string message = "     Step ";
    std::ostringstream oss;
    oss << step;
    message += oss.str();
    message += "     ";
    SetBkColor(hDC, RGB(255,255,0));
    TextOutA(hDC, 20, 10, message.c_str(), message.length());
    oss.str(""); oss.clear(); 
    message = "     Having met ";
    oss << meet;
    message += oss.str();
    message += " times     ";
    TextOutA(hDC, 20, 40, message.c_str(), message.length());
    SetBkColor(hDC, RGB(0,0,0));
 
    HBRUSH  blackBrush = CreateSolidBrush(RGB(0,0,0));
    for (i = 0; i<M; i++)
    {   SelectObject(hDC, blackBrush);
        x = dots[i]->GetPrev()->x; y = dots[i]->GetPrev()->y;
        Rectangle(hDC, x0+x*h+1, y0+y*h+1, x0+(x+1)*h, y0+(y+1)*h);
        
        SelectObject(hDC, dots[i]->GetBrush());
        x = dots[i]->GetCur()->x; y = dots[i]->GetCur()->y;
        Rectangle(hDC, x0+x*h+1, y0+y*h+1, x0+(x+1)*h, y0+(y+1)*h);
    }
    DeleteObject(blackBrush);
}
 
int main()
{   //SetWindowPos(hW, HWND_TOPMOST, 0,0,350,450,SWP_SHOWWINDOW);
    srand ((unsigned int) time (NULL));
    int N = 10;             //размер поля NxN
    int M = 2;              //кво объектов
    int step = 0;           //шаг 
    int h = 20;             //размер одной ячейки поля в пикселях
    int meet = 0;           //кво встреч 
    
    Dot **dots = CreateArray(M);
    POINT *point = new POINT;
    point->x = point->y = 0;
    dots[0]->SetDot (point, point, RGB(255,0,0));
    point->x = point->y = N-1;
    dots[1]->SetDot (point,point, RGB(0,255,0));
 
    SetField (N, h);
    ShowPicture (++step, meet, dots, M, N, h);
    
    while(++step < 500)
    {   NextMove (dots, M, N);
        if (Meeting (dots[0], dots[1])) meet++;
        ShowPicture (step, meet,dots, M, N, h);
        Sleep (100);
    }
 
    DeleteArray (dots, M);
    delete point;
    std::cin.get();
    return 0;
}
Миниатюры
Рандомное перемещение фишек по квадратной матрице (клеточный автомат)  
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
04.04.2014, 11:00
На средней картинке - момент встречи.

Цитата Сообщение от zitxbit Посмотреть сообщение
поскольку необходима установка boost
Строка 167: Sleep (100); - чем не таймер )
0
6 / 1 / 0
Регистрация: 04.10.2013
Сообщений: 42
04.04.2014, 15:17  [ТС]
хм...может вы слшком тривиально задачу понимаете ну или я криво объясняю...эта задача из лабораторных работ моего преподавателя....не думаю что тут надо слишком замудренные коды писать,ибо предыдущие работы такого типа...делались максимум в строчек 6..
Добавлю текст который написан перед задачей, может он поможет
"Для решения данной задачи требуется смоделировать процесс,
приведенный в задаче. Переменные должны хранить состояние
процесса и изменяться в цикле в соответствии с его описанием"


Добавлено через 1 минуту
будем надеяться и ждать
0
04.04.2014, 15:18

Не по теме:

Об обилии троеточий в посланиях советую почитать лурк.

0
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
04.04.2014, 15:30
Live4Sky, извините пожалуйста, я сегодня был очень занят и не смог написать обещанные исходники. Сделаю, обязательно это на днях. А вообще, то задача очень сложная и в 6 строк вы никогда не "впишитесь" (!). Поверьте мне на слово. P.S. Не знаю какой код предложил вам пользователь IrineK, но на самом деле все так и делается ) как у меня. Я для этой задачи использовал STL C++ 0x11, чего никогда, на форуме, не делал раньше. Это "дебют". Просто, наверное, необходимы комментарии к обоим исходникам от IrineK и от меня. Вы разберетесь в них, поучите, и представите как есть преподавателю. Кстати, сложность поставленной задачи, вариируется от написания рандомного автомата и до стохастических автоматов принятия решений (ака "процессоров"), и систем искусственного интеллекта.
1
04.04.2014, 16:03

Не по теме:

Цитата Сообщение от zitxbit Посмотреть сообщение
пользователь IrineK
:scratch:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2014, 16:03
Помогаю со студенческими работами здесь

Клеточный автомат
Ребят снова я со своим лабвью. Задача отброзить клеточный автомат 2D диффузии. Кто подскажет формулу и в какой из циклов ее пихнуть? И еще...

Клеточный автомат
Добрый день! Проблема: не знаю как сделать так, чтобы программа работала со StringGrig следующем образом. При нажатии кнопки...

Клеточный автомат
Никак не могу написать прогу. Если кто знает help me пожалуйста. А вот собственно и текст проги: Напишите прогу представляющую...

клеточный автомат жизни
Нужна ваша помощь. Необходимо заполнить матрицу 25 на 25 0 и 1. По краям матрицы 0. 0 - мертвая клетка 1 - живая клетка Если у...

Одномерный клеточный автомат
На рисунке показано несколько поколений одномерного клеточного автомата. У каждой клетки только два соседа — слева и справа, а поле...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru