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

Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как сделать в приложении С++ русский язык? http://www.cyberforum.ru/cpp-beginners/thread1239438.html
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Мне 11 лет, и я учусь программировать на С++. В своих программах я вынужден писать по-английски, потому-что если писать по-русски получаются какие-то каракули! Подскажите, пожалуйста, как сделать так, чтобы в прилжениях С++ был русский язык, а не каракули. Заранее благодарю!
C++ Найти определитель матрицы, с помощью разложения её по строке Помогите написать программу , в которой нужно найти определитель матрицы , с помощью разложения её по строке. В исходнике все расскладывает правильно, но ответ почему то неверный. #include "iostream" int det(int mas, int n,int t) { int i, j, k, m, l, s = 0 , b = 0 , p=0, d; if (n < 3) { http://www.cyberforum.ru/cpp-beginners/thread1239385.html
C++ Как можно совершить обход двоичного дерева нерекурсивно
Доброго времени суток. Хочу поинтересоваться: как можно совершить обход двоичного дерева нерекурсивно(!!!), желательно с примерами или полезными ссылками. Спасибо
C++ Инициализация вектора
у меня в классе есть vector из string (константный, просто строки нужны как образец для других функций), в конструкторе соответственно надо это дело как то проинициализировать... вообще можно наверное и просто массив строк сделать, только мне кажется это еще геморнее...
C++ Помогите сделать обход двоичного дерева http://www.cyberforum.ru/cpp-beginners/thread1239348.html
Есть некий проект (большой, несколько файлов), где происходит процессы со списком (добавление, удаление и т. д.). Структура: /** * Структура list_node описывает элемент списка */ typedef struct l_node{ void *data; // Указатель на данные l_node *next; // Указатель на следующий элемент } list_node;
C++ Алгоритм рекурсивного спуска подскажите что почитать про этот алгоритм? хочу реализовать парсер математических выражений (без переменных, но с функциями типа sin, cos...), пишу на c++ а то в гугле все примеры на других языках =( подробнее

Показать сообщение отдельно
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
07.08.2014, 12:32     Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля.
Давид, а приложенный в архиве экзешник точно собран именно на том коде, который в проекте? Ничего в проекте не менялось потом?
Если нет, то я значит криво перевел. Результат разный.
Кликните здесь для просмотра всего текста
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
#pragma hdrstop
#pragma argsused
 
#include <tchar.h>
#include <stdio.h>
#include <iomanip>
#include <iostream>
using namespace std;
 
// Всякая глобальная фигня сюда переехала
 
   int PseudoStringGrid[8][8]; // Заместо StringGrid
 
 
   //массив для храмения информации о посещенных клетках
   int board[8][8];
 
   //эти массивы используются для расчета новых координат коня
   //они указывают перемещение по горизонтали и вертикали
   int horizontal[8];
   int vertical[8];
 
   //текущие координаты
   int currentRow;
   int currentColumn;
 
   //этот массив нужен для выбора следующего хода
   int accessibility[8][8];
   int firstMove[8];
 
   /*Эта функция выполняет очередной ход. Текущие координаты передаются
   по ссылке (таким образом, функция их может изменить).
   Numb - код хода (используестя как индекс для массивов vertical и
   horizontal).
   cnt - счетчик, содержит номер очередного хода.*/
   void move( int board[][8], int vertical[], int horizontal[],
              int &currentRow, int &currentColumn, int Numb, int cnt );
 
   /*Эта функция выбирает очередной ход и возвращает его код. Если
   сделать ход нельзя, то функция возвращает "-1".
   crRow и crColumn - текущие координаты коня.*/
   int FindMove( int board[][8], int accessibility[][8],
                 int vertical[], int horizontal[], int crRow, int crColumn );
 
   /*При выполнении очередного хода эта функция уменьшает значения
   соответствующих элементов массива accessibility на 1.*/
   void DecAccessibility( int accessibility[][8],int horizontal[],
                          int vertical[], int crRow, int crColumn );
 
   void move(int board[][8], int vertical[], int horizontal[],               //// Бывшие методы формы
             int &currentRow, int &currentColumn, int Numb, int cnt);          //
   void DecAccessibility(int accessibility[][8],int horizontal[],              //
                         int vertical[], int crRow, int crColumn);             //
   int FindMove(int board[][8], int accessibility[][8],                        //
                int vertical[], int horizontal[], int crRow, int crColumn);  ////
 
 
int main()
{
//void __fastcall TForm1::Button1Click(TObject *Sender)
//{
  //установка начальных значений элементов массивов
  int board[][8] = {{0},{0},{0},{0},{0},{0},{0},{0}};
  int horizontal[] = {2, 1, -1, -2, -2, -1, 1, 2};
  int vertical[] = {-1, -2, -2, -1, 1, 2, 2, 1};
  int accessibility[][8] = {{2,3,4,4,4,4,3,2},
                            {3,4,6,6,6,6,4,3},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {4,6,8,8,8,8,6,4},
                            {3,4,6,6,6,6,4,3},
                            {2,3,4,4,4,4,3,2}};
  //инициализация генератора случайных чисел
  srand(time(NULL));
 
  bool Go = true; //признак того, что можно начинать ходить
  try
   {
     //установка начальных значений
     cout << "x: ";
     cin >> currentRow;// = StrToInt(Edit2->Text);
     cout << "y: ";
     cin >> currentColumn;// = StrToInt(Edit1->Text);
     cout << endl;
     //проверка допустимости начальных значений
     if(currentRow>7 || currentRow<0 || currentColumn>7 ||
                                        currentColumn<0)
      {
       //сообщение об ошибке
       cout << "Вы должны ввести цифру от 0 до 7";
       Go = false;
      }
   }
  catch(...)
   {
     cout << "Вы должны ввести цифру от 0 до 7";
     Go = false;
   }
  //начинаем искать решение
  if(Go)
   {
    //устанавливаем коня на заданную клетку
    DecAccessibility(accessibility, horizontal, vertical,
                              currentRow, currentColumn);
    board[currentRow][currentColumn] = 1;
    //StringGrid1->Cells[currentColumn][currentRow] = IntToStr(1);
    PseudoStringGrid[currentRow][currentColumn] = 1;
 
    int MoveNumber; //код хода
    int count = 1; //счетчик ходов
    bool exit = true; //нужна для выхода из цикла
 
    //перемещаем коня пока это возможно
    do
     {
       MoveNumber = FindMove(board, accessibility, vertical,
                     horizontal, currentRow, currentColumn);
       if (MoveNumber !=-1)
        {
          count++;
          move(board, vertical, horizontal, currentRow,
                     currentColumn, MoveNumber, count);
          DecAccessibility(accessibility, vertical, horizontal,
                                    currentRow, currentColumn);
        }
       else exit = false;
     }
    while(exit);
   }
 
   // Вывод в консоль результатов
   for( int i=0; i<8; i++ )
     {
     for( int j=0; j<8; j++ )
       {
       cout.width(3);
       cout << PseudoStringGrid[i][j];
       }
     cout << endl;
     }
 
cin.ignore(2);
return 0;
}
//---------------------------------------------------------------------------
void move(int board[][8], int vertical[], int horizontal[],
          int &currentRow, int &currentColumn, int Numb, int cnt)
{
  //изменяем текущие координаты
  currentRow += vertical[Numb];
  currentColumn += horizontal[Numb];
  //запоминаем, что на этой клетке мыуже были
  board[currentRow][currentColumn] = 1;
  //выводим номер хода в StringGrid
  //StringGrid1->Cells[currentColumn][currentRow] = IntToStr(cnt);
  PseudoStringGrid[currentRow][currentColumn] = cnt;
}
//---------------------------------------------------------------------------
void DecAccessibility(int accessibility[][8],int horizontal[],
                      int vertical[], int crRow, int crColumn)
{
  int Hmove, Vmove; //координаты клеток, лежащих в одном ходу от текущей
 
  //перебираем все возможные варианты ходов и уменьшаем на 1 значения
  //соответствующих элементов массива accessibility
  for(int i=0; i<8; i++)
   {
     Hmove = crRow + vertical[i];
     Vmove = crColumn + horizontal[i];
     //проверка выхода за границу массива
     if((Hmove<8)&&(Hmove>=0)&&(Vmove<8)&&(Vmove>=0))
       accessibility[Hmove][Vmove] -= 1;
   }
}
//---------------------------------------------------------------------------
int FindMove(int board[][8], int accessibility[][8],
             int vertical[], int horizontal[], int crRow, int crColumn)
{
  //Индексы элементов этого массива соответствуют кодам возможных ходов.
  //Элементы массива будут содержать "-1" если ход невозможен или
  //число равное значению соответствующего элемента массива accessibility
  int PossibleMoves[8] = {-1,-1,-1,-1,-1,-1,-1,-1};
 
  int tRow, tColumn; //временные координаты
 
  //проверяем все возможные варианты ходов
  for(int i=0; i<8; i++)
   {
    tRow = crRow + vertical[i];
    tColumn = crColumn + horizontal[i];
    //проверка выхода за границу массива и того, ходили ли мы на
    //эту клетку раньше
    if(tRow<8 && tRow>=0 && tColumn<8 &&tColumn>=0 &&
                             board[tRow][tColumn]==0)
      PossibleMoves[i] = accessibility[tRow][tColumn];
   }
 
  //анализ массива PossibleMoves
  int count = 0;
  int min = 8;
  int Pos = 0;
  //находим минимальный элемент массива не равный "-1", если таких
  //элементов несколько - запоминаем их количество
  for(int j=0; j<8; j++)
   if(PossibleMoves[j]!=-1 && PossibleMoves[j]<=min)
    {
     min = PossibleMoves[j];
     count++;
     Pos = j;
    }
 
  //возможных ходов нет
  if(count==0) return -1;
 
  //возможен только 1 ход (или он оптимальный)
  if(count==1) return Pos;
 
  //Возможно несколько ходов, но мы не можем определить какой из
  //них лучше. Поэтому выбираем ход случайным образом. При выборе
  //учитываем только лучшие ходы.
  int Ind = rand()%count;
  for(int k=0; k<8; k++)
    if(PossibleMoves[k]==min && Ind==0)
      {
       Pos = k;
       break;
      }
    else Ind--;
  return Pos;
}
 
Текущее время: 17:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru