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

Определить все ходы для белой шашки. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ как сделать правильно указатель на первую функцию http://www.cyberforum.ru/cpp-beginners/thread53770.html
#include "stdafx.h" #include "stdio.h" #include "conio.h" int F(int n) { if(n==0) return 1; if(n==1) return 1; return (n+(n-1)); } int _tmain(int argc, _TCHAR* argv)
C++ Что такое NULL ? Обьясните, что значит NUL часто вижу его в условиях и операторах а что это значит точто не знаю!!! http://www.cyberforum.ru/cpp-beginners/thread53769.html
Капли дождя C++
Здравствуйте!!! Помогите пожалуйста сделать на консольном окне капли дождя(то есть как льет дождь). Нужно чтобы они падали как на землю!!! Спасибо заранее!!!
DEV-C++ - виснет компилятор C++
Всем ещё раз привет.Пытаюсь скомпилировать код вида: #include <graphics.h> int main() { initwindow(400,300); // открыть окно для графики
C++ Как просуммировать список??? http://www.cyberforum.ru/cpp-beginners/thread53717.html
В узлы первого списка записаны цифры первого числа,а в узлы второго списка записаны цифры второго числа.Первый и второй список одной структуры.Каким образом их суммировать?Напишите пожалуйста функцию!!!
C++ непонятные ошибки Здравствуйте Ситуация такая: программа выводит в определенную часть экрана некую последовательность символов, затем запоминает эту определенную часть экрана в буфер, затем восстанавливает из буфера(последние 2 действия с использованием регистров) Компилируется с помощью Borland C++ 3.1 тк в DOS.H объединение REGS есть только в 16 разрядном компиляторе. листинг: #include <iostream.h>... подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
03.06.2010, 15:42     Определить все ходы для белой шашки.
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
270
271
272
273
274
275
276
277
278
279
280
281
//На шашечном поле в произвольном порядке расставлены шашки. 
//Для выбранной пользователем белой шашки определить все ее возможные ходы. 
//Учесть, что за один шаг белая шашка может сбить несколько черных шашек.
//Нужно использовать рекурсию.
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
 
const int VERT_MIN_VAL = 'a';
const int VERT_MAX_VAL = 'h';
 
const int HORIS_MIN_VAL = '1';
const int HORIS_MAX_VAL = '8';
 
typedef std::string  T_str;
 
enum T_shashka_color
{
    VNE_DOSKI = 0,
    EMPTY,
    WHITE,
    BLACK    
};
 
enum T_napravl
{
    VLEVO,
    VPRAVO,
    NAZAD_VLEVO,
    NAZAD_VPRAVO
};
 
typedef std::map<char, T_shashka_color>  T_doska_vert;
typedef std::map<char, T_doska_vert>     T_shashka_colors;
 
struct T_kletka
{
    char  vert_; //От 'a' до 'h'.   
    char  horis_;//От '1' до '8'.
    
    T_kletka(char  vert = 0, char  horis = 0) : vert_(vert), horis_(horis)
    {}
 
    T_kletka(T_str  str_coord) 
        : vert_(str_coord[0]), horis_(str_coord[1])        
    {}
 
    T_kletka  get_next_1(T_napravl  napravl)
    {
        int  vert_shift   = 0;
        int  horis_shift  = 0;
 
        switch(napravl)
        {
        case VLEVO: 
            vert_shift   = -1;
            horis_shift  =  1;
            break;
        case VPRAVO: 
            vert_shift   = 1;
            horis_shift  = 1;
            break;
        case NAZAD_VLEVO: 
            vert_shift   = -1;
            horis_shift  = -1;
            break;
        case NAZAD_VPRAVO: 
            vert_shift   =  1;
            horis_shift  = -1;
            break;
        default:
            ;           
        }//switch(napravl)
        return T_kletka(vert_ + vert_shift, horis_ + horis_shift);
    }
};//struct T_kletka
 
void  print_kletka(T_kletka  kletka)
{        
    std::cout << kletka.vert_ << kletka.horis_ << ' ';   
}
 
typedef std::vector<T_kletka>  T_path;
 
class T_doska
{
    T_shashka_colors  shashka_colors;
public:
    T_doska()
    {
        for(char vert = VERT_MIN_VAL; vert <= VERT_MAX_VAL; ++vert)
        {
            for(char horis = HORIS_MIN_VAL; horis <= HORIS_MAX_VAL; ++horis)
            {
                shashka_colors[vert][horis] = EMPTY;
            }
        }
    }
 
    bool  is_emty_kletka(T_kletka  kletka)
    {
        return get_shashka_color_ref(kletka) == EMPTY;
    }
 
    void swap_colors
        (
            T_kletka  kletka1,
            T_kletka  kletka2
        )
    {
        T_shashka_color&  color1 = get_shashka_color_ref(kletka1);
        T_shashka_color&  color2 = get_shashka_color_ref(kletka2);
        std::swap(color1, color2);
    }
 
    bool  are_raznocvetn_shashki
        (
            T_kletka  kletka1,
            T_kletka  kletka2
        )
    {
        T_shashka_color  color1 = get_shashka_color_ref(kletka1);
        T_shashka_color  color2 = get_shashka_color_ref(kletka2);
        return    color1 == WHITE && color2 == BLACK
               || color1 == BLACK && color2 == WHITE;       
    }
 
    void  del_shashka(T_kletka  kletka)
    {
        get_shashka_color_ref(kletka) = EMPTY;
    }
 
    void  set_white_shashka(T_kletka  kletka)
    {
        get_shashka_color_ref(kletka) = WHITE;
    }
 
    void  set_black_shashka(T_kletka  kletka)
    {
        get_shashka_color_ref(kletka) = BLACK;
    }
private:
    T_shashka_color&  get_shashka_color_ref(T_kletka  kletka)
    {
        return shashka_colors[kletka.vert_][kletka.horis_];    
    }
};//class T_doska
 
struct T_shashka
{
    void xod
        (            
            T_kletka  kletka,
            T_doska   doska
        )
    {
        T_path  path;
        path.push_back(kletka);       
        xod(VLEVO,  path, doska);
        xod(VPRAVO, path, doska);      
        
        bit(VLEVO,        path, doska);
        bit(VPRAVO,       path, doska);
        bit(NAZAD_VLEVO,  path, doska);
        bit(NAZAD_VPRAVO, path, doska);        
    }
 
    void xod
        (
            T_napravl  napravl,
            T_path     path,
            T_doska    doska
        )
    {        
        T_kletka  cur_kletka   = path.back();
        T_kletka  next_kletka  = cur_kletka.get_next_1(napravl);
        if(doska.is_emty_kletka(next_kletka))
        {                        
            doska.swap_colors(cur_kletka, next_kletka);
            path.push_back(next_kletka);
            print_path(path);            
        }     
    }
 
    void  bit
        (
            T_napravl  napravl,            
            T_path     path,
            T_doska    doska
        )
    {        
        T_kletka  cur_kletka   = path.back();
        T_kletka  next_kletka1 = cur_kletka   .get_next_1(napravl);
        T_kletka  next_kletka2 = next_kletka1 .get_next_1(napravl);
 
        if(doska.are_raznocvetn_shashki(cur_kletka, next_kletka1)
           && doska.is_emty_kletka(next_kletka2))
        {
            doska.swap_colors(cur_kletka, next_kletka2);            
            doska.del_shashka(next_kletka1);         
            path.push_back(next_kletka2);
 
            bit(VLEVO,        path, doska);
            bit(VPRAVO,       path, doska);
            bit(NAZAD_VLEVO,  path, doska);
            bit(NAZAD_VPRAVO, path, doska);
            print_path(path);                           
        }        
    }
 
    void  print_path(const T_path&  path)
    {
        static int xod_count = 0;
        std::cout << "ход " << ++xod_count << ":   ";
        std::for_each(path.begin(), path.end(), print_kletka);
        std::cout << std::endl;    
    }
};//struct T_shashka
 
bool is_correct_str_coord(T_str  str_coord)
{
     return    VERT_MIN_VAL <= str_coord[0]  && str_coord[0] <= VERT_MAX_VAL
            && HORIS_MIN_VAL <= str_coord[1] && str_coord[1] <= HORIS_MAX_VAL;   
}
 
int main()
{   
    std::locale::global(std::locale("rus"));   
    std::cout << "Введите координаты шашек в виде a1, c3, f8 и т.д. "
              << std::endl
              << "Окончание ввода - пустая строка."
              << std::endl;
 
    T_doska  doska;    
    T_str    bel_xodit_str_coord;
    for(;;)
    {
        std::cout << "Координаты белой шашки, делающей ход: ";        
        getline(std::cin, bel_xodit_str_coord);    
        if(bel_xodit_str_coord.empty()) return 0;
        if(is_correct_str_coord(bel_xodit_str_coord))
        {           
            doska.set_white_shashka(bel_xodit_str_coord);
            break;
        }
    }
 
    for(int vvodim_chernye = 0; vvodim_chernye < 2; ++vvodim_chernye)
    {
         std::cout << std::endl
                  << "Введите координаты "
                  << (vvodim_chernye ? "черных" : "белых")
                  << " шашек: "
                  << std::endl;        
 
        for(int i = 1;;)
        {
            std::cout << (vvodim_chernye ? "черная " : "белая ")
                      << i
                      << ": ";
            
            T_str  cur_shash_str_coord;
            getline(std::cin, cur_shash_str_coord);
            if(cur_shash_str_coord.empty()) break;        
            if(is_correct_str_coord(cur_shash_str_coord))
            {        
                vvodim_chernye ? doska.set_black_shashka(cur_shash_str_coord)
                               : doska.set_white_shashka(cur_shash_str_coord);
                ++i;
            }        
        }   
    }//for(bool vvodim_chernye = false; vvodim_chernye <= true; ++vvodim_chernye)
 
    std::cout << std::endl;
    T_shashka  bel_xodit_shash;    
    bel_xodit_shash.xod(bel_xodit_str_coord, doska);  
 
    return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru