Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
#1

Замена фигур на шахматной доске

09.08.2012, 09:51. Просмотров 1533. Ответов 18
Метки нет (Все метки)

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

Добавлено через 9 часов 7 минут
слабо? это, конечно, не диагональ симметричной матрицы вывести...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 09:51
Ответы с готовыми решениями:

Числа на шахматной доске
В клетках шахматной доски находятся целые число. --- Определить в программе...

Числа на шахматной доске в С++
В клетках шахматной доски находятся целые числа. --- Определить в программе...

Числа на шахматной доске
В клетках шахматной доски находятся целые число. --- Определить в программе...

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

Задача о зернах на шахматной доске
Математическая задача, в которой вычисляется, сколько будет зёрен на шахматной...

18
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 800
09.08.2012, 10:36 #2
А что собственно, не получается?
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
09.08.2012, 10:56 #3
Ну и причём тут С++?
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 10:57  [ТС] #4
как это сделать на с++. так на доске я расставляю и понимаю, какие поля у какого коня под боем. и на бумажке списки могу записать. а дальше - никак. какие классы нужны, какие поля, ф-ии...
0
Aloir
219 / 219 / 38
Регистрация: 17.12.2010
Сообщений: 710
09.08.2012, 11:23 #5
Цитата Сообщение от novi4ok Посмотреть сообщение
как это сделать на с++. так на доске я расставляю и понимаю, какие поля у какого коня под боем. и на бумажке списки могу записать. а дальше - никак. какие классы нужны, какие поля, ф-ии...
ну навскидку создаешь структуру типа

|
C++
1
2
3
4
5
6
struct pole{
 int Kon1;
 int Kon2;
 int Kon3;
 int Kon4;
};
дальше делаешь двухмерный массив типа pole, пробегаешься по нему расставляешь битые поля, каждому коню в свою переменню в структуре, а дальше уже делай все остальные необходимые манипуляции
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 11:25  [ТС] #6
Цитата Сообщение от Aloir Посмотреть сообщение
ну навскидку создаешь структуру типа

|
C++
1
2
3
4
5
6
struct pole{
 int Kon1;
 int Kon2;
 int Kon3;
 int Kon4;
};
дальше делаешь двухмерный массив типа pole, пробегаешься по нему расставляешь битые поля, каждому коню в свою переменню в структуре, а дальше уже делай все остальные необходимые манипуляции
а конь?
0
Aloir
219 / 219 / 38
Регистрация: 17.12.2010
Сообщений: 710
09.08.2012, 11:31 #7
Цитата Сообщение от novi4ok Посмотреть сообщение
а конь?
что конь?

даешь пользователю ввести координаты для четырех коней, можешь сделать отдельно какую структуру или просто переменные, тут можно по разному извращаться.

после ввода всех коней бежишь по полю, расставляешь битки, и считаешь что тебе нужно.
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 17:12  [ТС] #8
ну да, "задней левой" ... ж
0
yleart
60 / 45 / 12
Регистрация: 07.10.2011
Сообщений: 139
09.08.2012, 17:41 #9
Создаешь нулевую матрицу 8x8. Ставишь единицы - это кони. Потом пишешь 8 функции вероятных ходов коня, которые возвращают true если конь под боем какого либо... Ну вот и все xD
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 22:34  [ТС] #10
а конь? вообще без коня, только единицы? а как потом списки строить - вот "иду" я по этой матрице (шесть раз нужно пройти, наверное?), и что? вот "пришел" на клетку матрицы, она в списке? выводить ее?

Добавлено через 57 секунд
и никто ни строчки кода не предложил, только какая-то структура. "клуб четырех коней" какой-то.

Не по теме:

столица переезжает в васюки.

0
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 800
09.08.2012, 22:45 #11
Цитата Сообщение от novi4ok Посмотреть сообщение
и никто ни строчки кода не предложил, только какая-то структура. "клуб четырех коней" какой-то.
А вы попробуйте себя повежливее вести.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.08.2012, 23:00 #12
Цитата Сообщение от novi4ok Посмотреть сообщение
на доске я расставляю и понимаю, какие поля у какого коня под боем. и на бумажке списки могу записать. а дальше - никак.
Я понимаю, так: чем проще рассуждения тем легче рассуждать. У коня есть координаты. Что значит битое поле? Это поле куда возможен ход (неучитывая какой фигурой оно занято, тут решите сами, кстати если стоит дружеский конь то под боем ли он находится?)
Далее каждое такое поле по осям (четыре направления) определяется смещением на 2 позиции прямо (по x например) и одну позицию в сторону (по другой координате, для x это y). При проверке координат поля нужно проверить не вышли ли за пределы шахматного поля 8Х8 и возможно на наличие дружественного коня (если решите, что друзей не бьют)).
ps Для коня в центре доски - 4 направления двойного сдвига, по два одинарных сдвига в каждом, то есть 8 битых полей.
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 23:45  [ТС] #13

Не по теме:

Цитата Сообщение от defer Посмотреть сообщение
А вы попробуйте себя повежливее вести.
вежливо - это когда взрослым дядям не делают замечаний. в крайнем случае проходят мимо, надув губки.



Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я понимаю, так: чем проще рассуждения тем легче рассуждать. У коня есть координаты. Что значит битое поле? Это поле куда возможен ход (неучитывая какой фигурой оно занято, тут решите сами, кстати если стоит дружеский конь то под боем ли он находится?)
Далее каждое такое поле по осям (четыре направления) определяется смещением на 2 позиции прямо (по x например) и одну позицию в сторону (по другой координате, для x это y). При проверке координат поля нужно проверить не вышли ли за пределы шахматного поля 8Х8 и возможно на наличие дружественного коня (если решите, что друзей не бьют)).
ps Для коня в центре доски - 4 направления двойного сдвига, по два одинарных сдвига в каждом, то есть 8 битых полей.
понимаешь, я не хочу думать ни о битах, ни о клетках, пока не решу проблему дизайна. мы ведь с++ имеем. значит, классы можем создавать, которые что-то будут уметь. напрашивается пока участники "доска", "конь", "список" (или "генератор отчетов"? или и то и другое?). тогда уже и нолики по клеточкам можно раскладывать. но если сразу полезу рисовать матрицы с четырьмя единичками, запутяюсь. напишу, конечно, и так, но тогда самому нужно становиться конем, и через пару часов уже перестану понимать, как оно все работает. хороший (удачный) дизайн даже в такой примитивной задаче упрощает работу.

принимаются предложения по улучшению моего наброска списка участников.
0
rinat_w
89 / 85 / 17
Регистрация: 13.11.2011
Сообщений: 192
Завершенные тесты: 1
10.08.2012, 01:28 #14
novi4ok,
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
#include<iostream>
#include<ctime>
using namespace std;
bool is_under_attack(int a1, int x1, int a2, int x2){
     int check=abs(a1-a2)*10+abs(x1-x2);
     if (check==12 || check==21) return true;
     return false;
}
int main(){
    // создаем, инициализируем и отображаем координаты четырех коней
    srand(time(0));
    int horse[4][2];
    for (int i=0; i<8; i++){
        horse[i/2][i%2]=rand()%8+1;
        if (i%2==1) cout<<i/2+1<<" horse : "<<(char)(horse[i/2][0]+64)<<horse[i/2][1]<<endl;
    }
    
    cout<<"\n1 list : "; // список полей под боем каждого из коней
    for (int i=1; i<=4; i++){
        cout<<"\n\t"<<i<<" horse : ";
        for (int x=1; x<=8; x++)
            for (int y=1; y<=8; y++)
                if (is_under_attack(x,y,horse[i-1][0],horse[i-1][1])) cout<<(char)(x+64)<<y<<" ";
    }
    
    cout<<"\n\n2 list : \n"; // список полей под боем нескольких коней
    for (int x=1; x<=8; x++)
        for (int y=1; y<=8; y++){
            string result="";
            int count=0;
            for (int i=1; i<=4; i++)
                if (is_under_attack(x,y,horse[i-1][0],horse[i-1][1])){
                   count++;
                   result+=(char)(i+48);
                   result+=" ";
                }
            if (count>1) cout<<"\t"<<(char)(x+64)<<y<<" : "<<result<<endl;
        }
    
    cout<<"\n3 list : "; // поля не под боем
    for (int x=1; x<=8; x++)
        for (int y=1; y<=8; y++){
            int count=0;
            for (int i=1; i<=4; i++)
                if (is_under_attack(x,y,horse[i-1][0],horse[i-1][1])) count++;
            if (count==0) cout<<(char)(x+64)<<y<<" ";
        }
    
    cout<<"\n\n"; system("pause");
    return 0;
}
1
Миниатюры
Замена фигур на шахматной доске  
Aloir
13.08.2012, 02:35
  #15

Не по теме:


просто не там ответил)

0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
13.08.2012, 03:07 #16
Цитата Сообщение от novi4ok Посмотреть сообщение
напрашивается пока участники "доска", "конь", "список" (или "генератор отчетов"? или и то и другое?).
Можно сделать шахматное поле - клетка
хранит свою координату, указатели на бьющие фигуры, указатель на размещенную в нем фигуру.(указатели могут быть нулевыми).
фигура - хранит масть (цвет) координату, умеет возвращать список битых полей.
Доска (позиция) хранит список всех полей, фигур, умеет инициализировать поля, принимать запросы на перемещение фигуры и делать ход.
Отчеты генерирует внешняя ф-ция опрашивающая поля доски.
Всего то нового, - класс шахматная клетка (поле).
0
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 800
13.08.2012, 03:34 #17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно сделать шахматное поле - клетка
хранит свою координату, указатели на бьющие фигуры, указатель на размещенную в нем фигуру.(указатели могут быть нулевыми).
фигура - хранит масть (цвет) координату, умеет возвращать список битых полей.
Доска (позиция) хранит список всех полей, фигур, умеет инициализировать поля, принимать запросы на перемещение фигуры и делать ход.
Отчеты генерирует внешняя ф-ция опрашивающая поля доски.
Всего то нового, - класс шахматная клетка (поле).
Вы бы это в коде выложили, а словесных описаний в теме и так достаточно
0
Aloir
219 / 219 / 38
Регистрация: 17.12.2010
Сообщений: 710
13.08.2012, 20:11 #18
Цитата Сообщение от defer Посмотреть сообщение
Вы бы это в коде выложили, а словесных описаний в теме и так достаточно
Вы так рассуждаете как будто, мы обязаны вам предоставить решение данной задачи.

попробуйте выложить свой пример кода, или хотя бы набросок, а мы вас подправим.
0
SubTerran
8 / 8 / 1
Регистрация: 13.08.2012
Сообщений: 18
13.08.2012, 20:50 #19
Библиотека: Matrix.h
http://www.stroustrup.com/Programming/Matrix/Matrix.h

Библиотека: MatrixIO.h
http://www.stroustrup.com/Programming/Matrix/MatrixIO.h


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
//
// 
// 
//
 
#include<iostream>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include<vector>
#include<algorithm>
#include<stdexcept>
#include "Matrix.h"
#include "MatrixIO.h"
 
using namespace Numeric_lib;
using namespace std;
 
//------------------------------------------------------------------------------
 
enum Horses { none, white, black, fight_w1, fight_w2, fight_b1, fight_b2 };
 
//------------------------------------------------------------------------------
 
struct One_cell
{
    One_cell(int aa, int bb, Horses h1, Horses h2) :a(aa), b(bb) 
    { oc.first = h1; oc.second = h2; }
    int a;
    int b;
    pair<Horses, Horses> oc;
};
 
//------------------------------------------------------------------------------
 
vector<One_cell> one_cell;
 
//------------------------------------------------------------------------------
 
void f(Matrix<Horses, 2>& mtrx, int i, int j)
{
    string s;
    int f;
    if (mtrx(i, j) == white)
    {
        static int i2 = i;
        static int j2 = j;
        int k = 1;
        if (i != i2 || j != j2)
            k = 2;
        if (k == 1)
            s = "w1";
        else
            s = "w2";
        cout << "Поля под боем " << k << " белого коня\n";
    }
    else if (mtrx(i, j) == black)
    {
        static int i2 = i;
        static int j2 = j;
        int k = 1;
        if (i != i2 || j != j2)
            k = 2;
        if (k == 1)
            s = "b1";
        else
            s = "b2";
        cout << "Поля под боем " << k << " черного коня\n";
    }
 
    if (s == "w1")
        f = 3;
    else if (s == "w2")
        f = 4;
    else if (s == "b1")
        f = 5;
    else if (s == "b2")
        f = 6;
 
    if (i > 1 && j < 7)
    {
        if (mtrx(i - 2, j + 1) != none)
            one_cell.push_back(One_cell(i - 2, j + 1, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i - 2, j + 1) = Horses(f);
        cout << '(' << i - 2 << ',' << j + 1 << ") ";
    }
    if (j < 7 && j < 6)
    {
        if (mtrx(i + 1, j + 2) != none)
            one_cell.push_back(One_cell(i + 1, j + 2, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i + 1, j + 2) = Horses(f);
        cout << '(' << i + 1 << ',' << j + 2 << ") ";
    }
    if (j != 0 && i < 6)
    {
        if (mtrx(i + 2, j - 1) != none)
            one_cell.push_back(One_cell(i + 2, j - 1, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i + 2, j - 1) = Horses(f);
        cout << '(' << i + 2 << ',' << j - 1 << ") ";
    }
    if (i != 0 && j > 1)
    {
        if (mtrx(i - 1, j - 2) != none)
            one_cell.push_back(One_cell(i - 1, j - 2, mtrx(i - 2, j + 1), Horses(f)));
        mtrx(i - 1, j - 2) = Horses(f);
        cout << '(' << i - 1 << ',' << j - 2 << ") ";
    }
    cout << '\n';
}
 
//------------------------------------------------------------------------------
 
inline void keep_window_open()
{
    cin.clear();
    cout << "Please enter a character to exit\n";
    char ch;
    cin >> ch;
    return;
}
 
//------------------------------------------------------------------------------
 
inline int randint(int max) { return rand()%max; }
 
//------------------------------------------------------------------------------
 
int main()
    try
{
    setlocale( LC_ALL, "Russian" );
 
    Matrix<Horses, 2> mtrx(8, 8);
 
    srand(8);
 
    int n = 0;
    int k = 0;
    int p = 0;
 
    while(p != 2)
    {
        n = randint(8);
        k = randint(8);
        if (mtrx(n, k) != white)
        {
            mtrx(n, k) = white;
            ++p;
        }
    }
 
    p = 0;
 
    while(p != 2)
    {
        n = randint(8);
        k = randint(8);
        if (mtrx(n, k) != white && 
            mtrx(n, k) != black)
        {
            mtrx(n, k) = black;
            ++p;
        }
    }
 
    cout << mtrx << '\n';
 
    for (Index i = 0; i < 8; ++i)
        for (Index j = 0; j < 8; ++j)
        {
            if (mtrx(i, j) == white)
                f(mtrx, i ,j);
            else if (mtrx(i, j) == black)
                f(mtrx, i, j);
        }
 
    cout << "Поля не под боем ни одного из четырех: \n";
 
    for (Index i = 0; i < 8; ++i)
        for (Index j = 0; j < 8; ++j)
            if (mtrx(i, j) == none)
                cout << '(' << i << ',' << j << ") ";
 
    if (one_cell.size())
    cout << "\nСписок полей под боем нескольких: \n";
 
    for (int i = 0; i < one_cell.size(); ++i)
    {
        cout << '\n';
        if (one_cell[i].oc.first != one_cell[i].oc.second)
        {
        switch(one_cell[i].oc.first)
        {
        case 3:
            cout << "Белый конь 1\n";
            break;
        case 4:
            cout << "Белый конь 2\n";
            break;
        case 5:
            cout << "Черный конь 1\n";
            break;
        case 6:
            cout << "Черный конь 2\n";
            break;
        }
        switch(one_cell[i].oc.second)
        {
        case 3:
            cout << "Белый конь 1\n";
            break;
        case 4:
            cout << "Белый конь 2\n";
            break;
        case 5:
            cout << "Черный конь 1\n";
            break;
        case 6:
            cout << "Черный конь 2\n";
            break;
        }
        cout << '(' << one_cell[i].a << ',' << one_cell[i].b << ") ";
        }
    }
 
    cout << '\n' << mtrx << '\n';
 
    keep_window_open();
    return 0;
}
catch (exception& e) {
    cerr << "error: " << e.what() << '\n'; 
    keep_window_open();
    return 1;
}
catch (...) {
    cerr << "Oops: unknown exception!\n"; 
    keep_window_open();
    return 2;
}
 
//------------------------------------------------------------------------------
0
13.08.2012, 20:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 20:50

Расставить n ладей на шахматной доске n*n
Вообщем нужно расставить n ладей на шахматной доске n*n Вот то что у меня...

Геометрическая прогрессия на шахматной доске
Всем доброго времени суток.Отписывайтесь кто как решил. #include &quot;head.h&quot; ...

Расстановка ферзей на шахматной доске
Найти на кубической доске всевозможные расстановки 15 ферзей так, чтобы они не...


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

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

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