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

Игра Программистика - C++

Восстановить пароль Регистрация
 
Turkish
Сообщений: n/a
06.12.2010, 20:14     Игра Программистика #1
Ребята, помогите написать игру на С.
Вот задание:
игра "Программистика".Для игры требуются плоские квадратные фишки 4-х видов, представляющие собой поле 3*3 с вырезанной центральной клеткой. В остальных клетках каждой фишки записаны числа от 1 до 8. Все виды фишек показаны на рисунке. Количество фишек каждого вида не ограничено.
Игра проводится на поле размером N*N. Первоначально все клетки поля заполнены единицами.
В начале игры Магистр несколько раз случайным образом помещает произвольные фишки на игровое поле так, что фишка попадает на поле целиком, а ее центральная клетка совпадает с одной из клеток поля. После помещения очередной фишки все числа в восьми клетках игрового поля, которые перекрывает фишка, умножаются на соответствующие числа в клетках фишки, и результаты становятся новыми значениями этих клеток игрового поля.
Таким образом, после окончания процесса размещения фишек игровое поле оказывается заполненным полученными произведениями. Далее Магистр передает получившееся поле игроку, которому необходимо установить для каждой клетки поля, сколько раз Магистр в нее помещал центральные клетки фишек.
Требуется для каждого входного файла, содержащего полученное Магистром поле, сформировать соответствующий ему выходной файл, в N строках которого содержится по N чисел, показывающих, сколько раз в соответствующую клетку помещались центральные клетки фишек.
Входные данные
В каталоге C:\TESTS\4 находятся 7 входных файлов с именами game.01, game.02, :, game.07. В первой строке каждого из этих файлов записано N (3 < N < 100). В последующих N строках записано по N разделенных пробелами натуральных чисел, являющихся значениями полученных Магистром произведений, каждое из которых не превышает 2*10^9.
Выходные данные
Каждый выходной файл должен состоять из N строк по N разделенных пробелами чисел, показывающих для каждой клетки поля, сколько раз в нее помещались центральные клетки фишек.
Вам требуется представить на тестирование 7 выходных файлов с именами:
Р[номер участника]_4.[номер теста]
где <номер участника> - пятизначный номер участника, 4 - номер задачи, <номер теста> - двузначный номер теста задачи.
Например, у участника с номером 21111 выходной файл для теста № 3 должен называться P21111_4.03
Пример
Входной файл game.0x
5
1 2 3 1 1
8 1 140 48 7
7 6 120 1 16
1 1 15 8 3
1 1 1 1 1

Выходной файл Р21111_4.0x
0 0 0 0 0
0 1 0 0 0
0 0 0 2 0
0 0 0 0 0
0 0 0 0 0

Примечание Результатом решения задачи являются только 7 выходных файлов, которые и необходимо представить на проверку.

Добавлено через 1 минуту
Вот решение, осталось только программу написать....
решение:
Начнем просматривать игровое поле с левого верхнего угла(на верхней левый угол может влиять только карточка с центром в (2;2)). Будем пытаться поставить на клетку (2;2) все карточки, за исключением карточки номер 1. В случае, если карточку подставить можно, увеличиваем счетчик в точке (2;2) на 1, а значения окружающих ее клеток делим на числа, написанные на соответствующем месте карточки. Как только мы не сможем подставить ни одну из карточек с номерами от 2 до 4, перейдем к карточке 1(мы не переходили к ней раньше, т.к. неизвестно . Рассмотрим поле (2;1): у первой карточки на это место приходится число 2, у всех остальных числа: 7, 5, 3. Надо заметить что никакая комбинация из перемноженных чисел 3, 5 и 7 не даст 2k, т.к. будет нечетной. Проверим, на какую степень 2 мы можем разделить значение (2;1). Соответственное количество первых карточек имеет центр в точке (2;2). Обработаем для них другие покрываемые клеточки
Теперь представим, что самой верхней левой клеткой стала клетка (2;1). Повторим для нее те же операции. Когда мы достигнем верхней левой клетки (N - 2; 1) следующей за ней будет верхняя левая клетка (2;2). Повторим эту операцию, пока не проверим все поле. Если вы обработали все правильно, то оно должно быть заполнено единичками.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2010, 20:14     Игра Программистика
Посмотрите здесь:

Игра на С++ C++
C++ игра (с++)
C++ Игра на C++
C++ Игра слов, игра Scrabble
C++ Игра
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shultsman
Сообщений: n/a
07.02.2012, 19:16     Игра Программистика #2
2 Решение
Рассмотрим верхнюю левую клетку игрового поля (0,0) обозначим число, записанное в ней, за X. На нее могут оказать влияние только карточки с центром в ячейке (1,1), причём только своим левым верхним углом (т.е. числами 1 ,7 ,5 и 3 соответственно). Заметим, что числа 3, 5 и 7 взаимно просты (их НОД равен 1), а это означает, что разложение числа X на множители 3 ,5 и 7 однозначно. Таким образом, мы можем определить количество карточек 2 ,3 и 4 типа в клетке (1,1) как максимальные степени 7, 5 и 3 на которые делится число X . При этом следует не забывать изменять и другие клетки, которые накрывает карточка с центром в ячейке (1,1).Чтобы окончательно вычислить ответ в ячейке (1,1) следует также определить число карточек 1 типа. Заметим, что ячейка (1, 0) (обозначим ее содержимое за Y ) изменяется только под воздействием карточек с центром в (1,1) (умножается на чётное число) и карточек с центром в (2,1) (умножается на нечётное число). После удаления карточек 2 ,3 и 4 типа с центром в (1,1) умножать на чётное число эту ячейку может только карточка 1 типа с центром в (1,1) карточки в (2,1) чётность изменить не могут. Таким образом, количество карточек 1 типа с центром в (1,1) определяется как максимальная степень 2 , на которую делится число Y (при этом, опять же, следует не забывать пересчитывать значения во всех ячейках, накрываемой данной карточкой). Тот же метод можно использовать для последовательного вычисления ячеек, двигаясь во внешнем цикле по строкам, а во внутреннем по столбцам. Предыдущая часть будет уже полностью вычислена и не окажет никакого влияния.

Листинг на языке c#

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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Programmistika
{
public abstract class Fishka
    {
        static int size = 3;
        protected int[,] values = new int[size, size];
        public int Size
        {
            get { return Fishka.size; }
        }
        public int this[int index1, int index2]
        {
            get
            {
                return values[index1, index2];
            }
        }
    }
 
    class Fishka1 : Fishka
    {
       
        public Fishka1()
        {
            values[0, 0] = 1;
            values[0, 1] = 8;
            values[0, 2] = 7;
            values[1, 0] = 2;
            values[1, 1] = 0;
            values[1, 2] = 6;
            values[2, 0] = 3;
            values[2, 1] = 4;
            values[2, 2] = 5;
        }
    class Fishka2 : Fishka
    {
        public Fishka2()
        {
            values[0, 0] = 7;
            values[0, 1] = 6;
            values[0, 2] = 5;
            values[1, 0] = 8;
            values[1, 1] = 0;
            values[1, 2] = 4;
            values[2, 0] = 1;
            values[2, 1] = 2;
            values[2, 2] = 3;
        }
    public Fishka3()
        {
            values[0, 0] = 5;
            values[0, 1] = 4;
            values[0, 2] = 3;
            values[1, 0] = 6;
            values[1, 1] = 0;
            values[1, 2] = 2;
            values[2, 0] = 7;
            values[2, 1] = 8;
            values[2, 2] = 1;
        }
    public Fishka4()
        {
            values[0, 0] = 3;
            values[0, 1] = 2;
            values[0, 2] = 1;
            values[1, 0] = 4;
            values[1, 1] = 0;
            values[1, 2] = 8;
            values[2, 0] = 5;
            values[2, 1] = 6;
            values[2, 2] = 7;
        }
    sealed class Pole
    {
        static int size;
        public static int Size
        {
            get { return Pole.size; }
            set { Pole.size = value; }
        }
        static int[,] values;
        private Pole(int razmer)
        {
            Pole.size = razmer;
            values = new int[Size,Size];
            for (int i = 0; i < razmer; i++)
                for (int j = 0; j < razmer; j++)
                    Pole.values[i, j] = 1;
        }
        public int this[int index1, int index2]
        {
            get { return values[index1,index2]; }
            set { values[index1,index2] = value; }
        }
        public static Pole Create_Pole(int razmer)
        {            
            return  new Pole(razmer);
        }
    }
    sealed class Count
    {
        static int size;
        public static int Size
        {
            get { return Count.size; }
            set { Count.size = value; }
        }
        static int[,] values;
        private Count(int razmer)
        {
            Count.size = razmer;
            values = new int[Size,Size];
            for (int i = 0; i < razmer; i++)
                for (int j = 0; j < razmer; j++)
                    Count.values[i, j] = 0;
        }
        public int this[int index1, int index2]
        {
            get { return values[index1,index2]; }
            set { values[index1,index2] = value; }
        }
        public static Count Create_Pole(int razmer)
        {            
            return  new Count(razmer);         
        }
    }
 
    public partial class Form1 : Form
    {
        Fishka selected_fishka;
        Pole pole = Pole.Create_Pole(18);
        Count count = Count.Create_Pole(18);
        Fishka1 fishka1 = new Fishka1();
        Fishka2 fishka2 = new Fishka2();
        Fishka3 fishka3 = new Fishka3();
        Fishka4 fishka4 = new Fishka4();
        public Form1()
        {
 
            InitializeComponent();
 
            dataGridView1.ColumnCount = Pole.Size;
            dataGridView1.RowCount = Pole.Size;
 
            dataGridView2.ColumnCount = fishka1.Size;
            dataGridView2.RowCount = fishka1.Size;
 
            dataGridView3.ColumnCount = fishka2.Size;
            dataGridView3.RowCount = fishka2.Size;
 
            dataGridView4.ColumnCount = fishka3.Size;
            dataGridView4.RowCount = fishka3.Size;
 
            dataGridView5.ColumnCount = fishka4.Size;
            dataGridView5.RowCount = fishka4.Size;
 
            dataGridView6.ColumnCount = Count.Size;
            dataGridView6.RowCount = Count.Size;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < Pole.Size; i++)
                for (int j = 0; j < Pole.Size; j++)
                    dataGridView1[i, j].Value = pole[i, j];
            for (int i = 0; i < fishka1.Size; i++)
                for (int j = 0; j < fishka1.Size; j++)
                    dataGridView2[i, j].Value = fishka1[i, j];
            for (int i = 0; i < fishka2.Size; i++)
                for (int j = 0; j < fishka2.Size; j++)
                    dataGridView3[i, j].Value = fishka2[i, j];
            for (int i = 0; i < fishka3.Size; i++)
                for (int j = 0; j < fishka3.Size; j++)
                    dataGridView4[i, j].Value = fishka3[i, j];
            for (int i = 0; i < fishka4.Size; i++)
                for (int j = 0; j < fishka4.Size; j++)
                    dataGridView5[i, j].Value = fishka4[i, j];
        }
 
        private void dataGridView2_Click(object sender, EventArgs e)
        {
            selected_fishka = fishka1;
        }
 
        private void dataGridView5_Click(object sender, EventArgs e)
        {
            selected_fishka = fishka4;
        }
 
        private void dataGridView4_Click(object sender, EventArgs e)
        {
            selected_fishka = fishka3;
        }
 
        private void dataGridView3_Click(object sender, EventArgs e)
        {
            selected_fishka = fishka2;
        }
 
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                for (int i = e.ColumnIndex, k = 0; k < selected_fishka.Size; k++, i++)
                    for (int j = e.RowIndex, l = 0; l < selected_fishka.Size; l++, j++)
                    {
                        if (k == 1 && l == 1)
                            continue;
                        pole[i, j] = pole[i, j] * selected_fishka[k, l];
                    }
                for (int i = 0; i < Pole.Size; i++)
                    for (int j = 0; j < Pole.Size; j++)
                        dataGridView1[i, j].Value = pole[i, j];
            }
            catch
            {
                MessageBox.Show("Нужно выбрать фишку");
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Calculate();
        
            for (int i = 0; i < Count.Size; i++)
                for (int j = 0; j < Count.Size; j++)
                    dataGridView6[i, j].Value = count[i, j];
        }
 
        public void extract(Fishka fishka, int i, int  j)
        {
            for (int l = 0; l < fishka.Size; l++)
                for (int m = 0; m < fishka.Size; m++)
                    if(fishka[m,l]!=0)
                    pole[i + m, j + l] /= fishka[m,l];
        }
 
        public void Calculate()
        {
            for (int i = 0; i < Pole.Size - 1; i++)
                for (int j = 0; j < Pole.Size - 1; j++)
                    if (pole[i, j] == 1)
                        while (pole[i, j + 1] % 2 == 0)
                        {
                            count[i + 1, j + 1]++;
                            extract(fishka1, i, j);
                        }
                    else
                        while (pole[i, j] != 1)
                        {
                            if (pole[i, j] % fishka2[0, 0] == 0)
                                extract(fishka2, i, j);
                            else if (pole[i, j] % fishka3[0, 0] == 0)
                                extract(fishka3, i, j);
                            else if (pole[i, j] % fishka4[0, 0] == 0)
                                extract(fishka4, i, j);
                            count[i + 1, j + 1]++;
                        }
        }
}
 Комментарий модератора 
Используйте теги форматирования кода!
Turkish
Сообщений: n/a
07.02.2012, 20:41     Игра Программистика #3
Спасибо за уделенное внимание- но этому вопросу уже 2 года)))
Я уже решил эту задачку))
Shultsman
Сообщений: n/a
08.02.2012, 19:43     Игра Программистика #4
Незачто, просто я недавно столкнулся с этой задачей, а решения не нашел.... Решил сам, и выложил в инет может кому нибудь понадобится)))
Yandex
Объявления
08.02.2012, 19:43     Игра Программистика
Ответ Создать тему
Опции темы

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