0 / 0 / 0
Регистрация: 24.12.2018
Сообщений: 1
1

Расстановка шахматных фигур

24.12.2018, 17:43. Показов 4335. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана квадратная шахматная доска размером N x N. На доске уже размещено K фигур. Фигуры размещены так, что находятся не под боем друг друга.
Необходимо расставить на доске еще L фигур так, чтобы никакая из фигур на доске не находилась под боем любой другой фигуры. Необходимо найти все возможные решения.

Входные данные: файл input.txt. На первой строке файла записаны три числа: N L K (через пробел). Далее следует K строк, содержащих числа x и y (через пробел) - координаты уже стоящей на доске фигуры. Координаты отсчитываются от 0 до N-1. 1 <= N <= 24.

Выходные данные: файл output.txt. На каждое найденное решение необходимо записать в файл одну строку. Строка состоит из пар (x,y) - координаты фигур на доске. В решение следует вывести координаты всех фигур, находящихся на доске. Каждую фигуру необходимо записать в виде пары координат, разделенных запятой и обрамленных скобками. Координаты отсчитываются от 0 до N-1. Порядок, в котором фигуры перечислены в решении, не имеет значения. Порядок перечисления решений не имеет значения. Выводимые решения не должны содержать повторы, т.е. каждое найденное решение необходимо вывести только один раз.
Если не было найдено ни одного решения, в файл необходимо записать no solutions.

Ваша фигура - полководец. Фигура объединяет в себе возможности короля и коня, т.е. под боем оказываются все клетки, смежные с фигурой, а также клетки (+-1,+-2), (+-2,+-1) от фигуры

Для входных данных :
5 7 1
2 4
Программа выводит только один(первый) набор из всех возможных:
(0,0) (0,2) (0,4) (2,0) (2,2) (2,4) (4,0) (4,2)

Как сделать так чтобы программа выводила ВСЕ ВОЗМОЖНЫЕ наборы , а не только первый.

В функцию Chess подается двумерный массив вида (НА ПРИКРЕПЛЕННОМ РИСУНКЕ НЕВЕРНО РАСПОЛОЖЕНИЕ ИЗНАЧАЛЬНО ПОСТАВЛЕННОЙ ТОЧКИ (2,4)):

0 1 2 3 4
00 0 0 2 0
10 0 2 2 2
20 0 0 2 10
30 0 2 2 2
40 0 0 2 0


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
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <conio.h> 
 
int Chess( int k, int N, int board[25][25], int L, int x2, int y2, int lk , FILE *f2)
{
for (x2; x2 < N; x2++)
    {
        for (y2; y2 < N; y2++)
        {
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    if (board[i][j] == 1 || board[i][j]==10)// все то же заполнение ячеек под боем
                    {
                        if (i - 1 > -1)
                        {
                            board[i - 1][j] = 2;
                        }
                        if ((i - 1 > -1) && (j + 1 < N))
                        {
                            board[i - 1][j + 1] = 2;
                        }
                        if (i - 1 > -1)
                        {
                            board[i - 1][j - 1] = 2;
                        }
                        if (j - 1 > -1)
                        {
                            board[i][j - 1] = 2;
                        }
                        if (j + 1 < N)
                        {
                            board[i][j + 1] = 2;
                        }
                        if ((i + 1 < N) && (j - 1 > -1))
                        {
                            board[i + 1][j - 1] = 2;
                        }
                        if (i + 1 < N)
                        {
                            board[i + 1][j] = 2;
                        }
                        if ((i + 1 < N) && (j + 1 < N))
                        {
                            board[i + 1][j + 1] = 2;
                        }
                        if ((i - 2 > -1) && (j - 1 > -1))
                        {
                            board[i - 2][j - 1] = 2;
                        }
                        if ((i - 1 > -1) && (j - 2 > -1))
                        {
                            board[i - 1][j - 2] = 2;
                        }
                        if ((i - 2 > -1) && (j + 1 < N))
                        {
                            board[i - 2][j + 1] = 2;
                        }
                        if ((i - 1 > -1) && (j + 2 < N))
                        {
                            board[i - 1][j + 2] = 2;
                        }
                        if ((i + 1 < N) && (j + 2 < N))
                        {
                            board[i + 1][j + 2] = 2;
                        }
                        if ((i + 1 < N) && (j - 2 > -1))
                        {
                            board[i + 1][j - 2] = 2;
                        }
                        if ((i + 2 < N) && (j + 1 < N))
                        {
                            board[i + 2][j + 1] = 2;
                        }
                        if ((i + 2 < N) && (j - 1 > -1))
                        {
                            board[i + 2][j - 1] = 2;
                        }
                    }
                }
            }
 
            if ((board[x2][y2]==0) && (board[x2 - 1][y2] != 1) && (board[x2 - 1][y2 + 1] != 1) && (board[x2 - 1][y2 - 1] != 1) && (board[x2][y2 - 1] != 1) && (board[x2][y2 + 1] != 1) && (board[x2 + 1][y2 - 1] != 1) && (board[x2 + 1][y2] != 1) && (board[x2 + 1][y2 + 1] != 1) && (board[x2 - 2][y2 - 1] != 1) && (board[x2 - 1][y2 - 2] != 1) && (board[x2 - 2][y2 + 1] != 1) && (board[x2 - 1][y2 + 2] != 1) && (board[x2 + 1][y2 + 2] != 1) && (board[x2 + 1][y2 - 2] != 1) && (board[x2 + 2][y2 + 1] != 1) && (board[x2 + 2][y2 - 1] != 1)&& (board[x2 - 1][y2] != 10) && (board[x2 - 1][y2 + 1] != 10) && (board[x2 - 1][y2 - 1] != 10) && (board[x2][y2 - 1] != 10) && (board[x2][y2 + 1] != 10) && (board[x2 + 1][y2 - 1] != 10) && (board[x2 + 1][y2] != 10) && (board[x2 + 1][y2 + 1] != 10) && (board[x2 - 2][y2 - 1] != 10) && (board[x2 - 1][y2 - 2] != 10) && (board[x2 - 2][y2 + 1] != 10) && (board[x2 - 1][y2 + 2] != 10) && (board[x2 + 1][y2 + 2] != 10) && (board[x2 + 1][y2 - 2] != 10) && (board[x2 + 2][y2 + 1] != 10) && (board[x2 + 2][y2 - 1] != 10)) //это проверка окрестности на наличие уже изначально стоявшей фигуры (10) и поставленной(1)
                {
            k++;
            board[x2][y2] = 1;
            }
            if (x2 + 1 >= N)
            {
                x2=0;
                y2++;
            }
            else
            {
                x2++;
            }
            if (k < L)
             {
                 return Chess( k, N, board, L,x2,y2,lk, f2);
             }
             for (int i = 0; i < N; i++)
             {
                 for (int j = 0; j < N; j++)
                 {
                     if (board[i][j] == 10 || board[i][j] == 1)
                     fprintf(f2, "(%d,%d)", i, j);
                 }
             }
             for (int i = 0; i < N; i++)  //отчистка 
             {
                 for (int j = 0; j < N; j++)
                 {
                     if (board[i][j] == -2 || board[i][j] == 1) 
                     {board[i][j] = 0;}
                 }
             }
             
        }    
    }
}
 
 
 
 
        int main()
        {
            FILE *f1 = fopen("input.txt", "r");
            FILE *f2;
            int N, L, K;
            fscanf_s(f1, "%d %d %d", &N, &L, &K);
            int x[10000];
            int y[10000];
            int lk=L+K;
            for (int i = 0; i < K; i++)
            {
                fscanf_s(f1, "%d %d", &x[i], &y[i]);
            }
            int board[25][25];
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    board[i][j] = 0;
                }
            }
            for (int i = 0; i < K; i++)
            {
                board[x[i]][y[i]] = 10;
            }
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    if (board[i][j] == 10) // ниже тоже заполнение ячеек , которые находятся под боем (2)
                    {
                        if (i - 1 > -1)
                        {
                            board[i - 1][j] = 2;
                        }
                        if ((i - 1 > -1) && (j + 1 < N))
                        {
                            board[i - 1][j + 1] = 2;
                        }
                        if (i - 1 > -1)
                        {
                            board[i - 1][j - 1] = 2;
                        }
                        if (j - 1 > -1)
                        {
                            board[i][j - 1] = 2;
                        }
                        if (j + 1 < N)
                        {
                            board[i][j + 1] = 2;
                        }
                        if ((i + 1 < N) && (j - 1 > -1))
                        {
                            board[i + 1][j - 1] = 2;
                        }
                        if (i + 1 < N)
                        {
                            board[i + 1][j] = 2;
                        }
                        if ((i + 1 < N) && (j + 1 < N))
                        {
                            board[i + 1][j + 1] = 2;
                        }
                        if ((i - 2 > -1) && (j - 1 > -1))
                        {
                            board[i - 2][j - 1] = 2;
                        }
                        if ((i - 1 > -1) && (j - 2 > -1))
                        {
                            board[i - 1][j - 2] = 2;
                        }
                        if ((i - 2 > -1) && (j + 1 < N))
                        {
                            board[i - 2][j + 1] = 2;
                        }
                        if ((i - 1 > -1) && (j + 2 < N))
                        {
                            board[i - 1][j + 2] = 2;
                        }
                        if ((i + 1 < N) && (j + 2 < N))
                        {
                            board[i + 1][j + 2] = 2;
                        }
                        if
 
                            ((i + 1 < N) && (j - 2 > -1))
                        {
                            board[i + 1][j - 2] = 2;
                        }
                        if ((i + 2 < N) && (j + 1 < N))
                        {
                            board[i + 2][j + 1] = 2;
                        }
                        if ((i + 2 < N) && (j - 1 > -1))
                        {
                            board[i + 2][j - 1] = 2;
                        }
 
                    }
                }
            }
            fclose(f1);
            int k = 0;
            f2 = fopen("output.txt", "w");
            int x2 = 0;
            int y2 = 0;
            return Chess(k, N, board, L,x2,y2,lk, f2);
 
            fclose(f2);
        }
Миниатюры
Расстановка шахматных фигур  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2018, 17:43
Ответы с готовыми решениями:

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

Как вывести юникод символы Шахматных фигур
Не получается вывести фигуры шахмат в c++ ♔♕♖♗♘♙♚♛♜♝♞♟ Кто знает как решить проблему?

Найти координаты шахматных клеток одного цвета
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { //ifstream...

Написать программу, подсчитывающую, сколько можно набрать различных семизначных «шахматных» номеров...
Условие: Телефонный номер называется «шахматным», если его цифры набираются на телефонном...

0
24.12.2018, 17:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2018, 17:43
Помогаю со студенческими работами здесь

Как много шахматных слонов можно расставить, чтобы они не угрожали друг другу?
Какое наибольшее число слонов можно расставить на шахматной доске так, чтобы никакие из них не...

Расстановка 8 ферзей
Привет всем, слушайте, вот исходник на С++ задача &lt;&lt;о восьми ферзях&gt;&gt;: #include&lt;iostream&gt;...

Расстановка кирпичей
Сколькими способами можно замостить 3xn прямоугольник при помощи 2x1 доминошек? Ниже наведен пример...

«Расстановка кубиков»
Программа играющая в игру «Расстановка кубиков». Игральный кубик можно перекатывать по клеткам поля...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru