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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
#1

Похождения коня - C++

26.11.2012, 17:27. Просмотров 571. Ответов 8
Метки нет (Все метки)

Добрый день!
Пишу программу для решения шахматной задачи "Похождения коня," ( Условие : Требуется обойти конем все 64 клетки шахматной доски так, чтобы на каждой клетке конь был только один раз. Доска - 8х8 ) и возникла проблема : после хода коня нужно проверить все клетки, на которые он мог бы пойти, считать их значение и записать его в другой массив. Функцию для этого я написал, и программа выполняет всё что нужно, но после выполнения возникает ошибка APPCRASH вот описание ошибки :
Кликните здесь для просмотра всего текста
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: tt2.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 50b364b6
Имя модуля с ошибкой: tt2.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 50b364b6
Код исключения: c0000005
Смещение исключения: 0002c7de
Версия ОС: 6.1.7600.2.0.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Вот код программы:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
using namespace std;
    void PrintchArrayBoard(char *pchArrayBoard,char chArrayBoard[8][8]) // Печать доски (char массив)
    {
        for (int i = 0; i < 8; i++) //вывод массива
        {
            pchArrayBoard = chArrayBoard[i];// строки
                for (int j = 0; j < 8; j++)
                {
                    std::cout <<" "<< *(pchArrayBoard+j); //столбцы
 
                }
            cout <<endl;
        }
    }
    void PrintintArrayBoard(int *pintArrayBoard,int intArrayBoard[8][8]) // Печать доски (int массив)
    {
        for (int i = 0; i < 8; i++) //вывод массива
        {
            pintArrayBoard = intArrayBoard[i];// строки
                for (int j = 0; j < 8; j++)
                {
                    std::cout <<" "<< intArrayBoard[i][j]; //столбцы
 
                }
            cout <<endl;
        }
    }
    void Move(int movex,int movey, char *pchArrayBoard,char chArrayBoard[8][8]) // Функция движения (отмечает ход в другом, символьном массиве)
    {
    pchArrayBoard = chArrayBoard[movex];
    *(pchArrayBoard+movey)= 'y';
    }
    void ReductionPossibleMoves(int movex,int movey, int *pintArrayBoard,int intArrayBoard[8][8],int *pintArrayPossibleMovement) // Инициализация возможных ходов
    {
        int mx, my, y, x;
        //Просмотр доступных ходов
        for (int i = 0;i < 8; i++)
        {
            mx=movex;my=movey;
                 if (i == 0) {x = -1; y = -2;} // перебор возможных ходов
            else if (i == 1) {x = -1; y =  2;}
            else if (i == 2) {x =  1; y = -2;}
            else if (i == 3) {x =  1; y =  2;}
            else if (i == 4) {x =  2; y =  1;}
            else if (i == 5) {x =  2; y = -1;}
            else if (i == 6) {x = -2; y =  1;}
            else if (i == 7) {x = -2; y = -1;}
            mx+=x;
            my+=y;
            if ((mx>=0) && (mx<=8) && (my>=0) && (my<=8)) // установка границы
            {
            pintArrayBoard = intArrayBoard[mx];
 
            *(pintArrayBoard + my) -= 1; // Уменьшение значения клетки(возможного хода) на 1
 
            pintArrayPossibleMovement[i] = *(pintArrayBoard + my); // Передача значения из одного массива в другой,
                                                                   // если строку закоментировать, то ошибки не будет.
 
            }
 
        }
    }
    //void ChoiceMove (int movex, int movey,int intArrayPossibleMovement[8], int *pintArrayPossibleMovement,int intArrayBoard[8][8], int *pintArrayBoard)
    //{
 
    //}
int main()
{
    srand(time(NULL));
    int movex = 2 + rand() % 4, movey = 2 + rand() % 4;// Случайный первый ход
    cout<<movex<<movey<<endl<<endl<<endl;
        char chArrayBoard[8][8] =
        {
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'},
            {'x','x','x','x','x','x','x','x'}
        };
        int intArrayBoard[8][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}
        };
 
        int intArrayPossibleMovement[8] = {0,0,0,0,0,0,0,0}; // массив для хранения значений клеток возможных ходов.
        int *pintArrayPossibleMovement;
 
    char *pchArrayBoard;
    int *pintArrayBoard;
 
 
    ReductionPossibleMoves(movex, movey,pintArrayBoard,intArrayBoard,pintArrayPossibleMovement);
 
    //ChoiceMove(movex, movey,intArrayPossibleMovement,pintArrayPossibleMovement,intArrayBoard, pintArrayBoard);
 
    Move(movex,movey,pchArrayBoard,chArrayBoard);
 
    PrintintArrayBoard(pintArrayBoard,intArrayBoard);
 
    PrintchArrayBoard(pchArrayBoard,chArrayBoard);
 
    for (int i = 0;i<8;i++)
    {
        if (pintArrayPossibleMovement[i]>=0 && pintArrayPossibleMovement[i]<8)
        cout<<pintArrayPossibleMovement[i];
    }
 
    return 0;
    }

Хотелось бы узнать, в чём проблема, и как её решить. Буду благодарен за помощь!

Добавлено через 12 минут
Ошибка в строке 58 , если её закомментировать - ошибки не будет.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 17:27     Похождения коня
Посмотрите здесь:

Путешесвтие коня. - C++
Я написал программу про ход коня. Мне надо доделать, если ход сделать нельзя (выходит за размер доски) то писал введите другое число и...

Ход коня - C++
Здравствуйте, уважаемые форумчане!!! у меня возникла проблема с задачей про коня!!! Дело в том что первоначальные значения координат...

Кратчайший путь коня с++ - C++
помогите пожалуйста написать алгоритм кротчайшего пути коня на шахматной доске из А в Б

Ходы шахматного коня - C++
Задача заключается в том, чтобы найти минимальное количество ходов для перехода шахматного коня с клетки T1 на клетку T2. Если у кого-то...

Задача - Путешествие коня - C++
Выдает необработанное исключение #include &lt;iostream&gt; using std::cout; using std::endl; #include &lt;ctime&gt; using std::time; ...

Головоломка о путешествии коня - C++
Задача - составить такую последовательность ходов, при которой конь может обойти всю шахматную доску, побывав на каждой клетке лишь один...

Задачка про Коня и Короля - C++
Задана шахматная доска, на которой расставлены черные и белые фигуры, в том числе белый король и черный конь. Определить, может ли белый...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 17:44     Похождения коня #2
по всей видимости, в этой части
C++
1
*(pintArrayBoard + my)
my неверно считается, что приводит к выходу за пределы массива и завершению программы - но это чисто теория, программу пока до конца не разобрал, посмотрю может что и найду =)
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
26.11.2012, 17:45     Похождения коня #3
А где выделяется память под pintArrayPossibleMovement?
В упор не вижу. Если не выделяется, то Вы пишите в никуда.
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 17:47  [ТС]     Похождения коня #4
строка 98
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
26.11.2012, 17:48     Похождения коня #5
Цитата Сообщение от kciosdse Посмотреть сообщение
строка 98
Это объявление указателя, но нет его инициализации - в результате указатель указывает не пойми куда, поэтому и происходит ошибка.
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 17:51  [ТС]     Похождения коня #6
Проблема в том что значения успешно передаются из одного массива, во второй, потом из второго выводится (пока для проверки) а уже потом программа вылетает.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Это объявление указателя, но нет его инициализации - в результате указатель указывает не пойми куда, поэтому и происходит ошибка.
Ну... в таком случае я вообще нигде не выделял память) просто только начал делать динамические массивы, и ещё не совсем всё понял.
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
26.11.2012, 17:54     Похождения коня #7
C++
1
2
3
    int *pintArrayPossibleMovement=intArrayPossibleMovement; 
    char *pchArrayBoard=&(chArrayBoard[0][0]);
    int *pintArrayBoard=&(intArrayBoard[0][0]);
kciosdse
0 / 0 / 0
Регистрация: 26.11.2012
Сообщений: 55
26.11.2012, 18:00  [ТС]     Похождения коня #8
Большое спасибо за помощь! Только хотелось бы уточнить - вы указателю присвоили значение адреса статического массива? И ещё, где-то читал что память выделяется функцией "new".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 18:25     Похождения коня
Еще ссылки по теме:

программа шахматы (маршрут коня) - C++
Указать маршрут коня, начинающийся на одном заданном поле шахматной доски и оканчивающийся на другом. Никакое поле не должно встречаться в...

Задача о ходе коня. Опять - C++
Доброе время суток. Мой пост уже второй по этой программе. В прошлый раз меня просили ее сделать более понятной. Ну старался как мог. И...

Путешествие коня. Упрощеннаяя версия. - C++
Здравствуйте! Мне препод задал более упрощенную версию задачи про путешествие коня. Условие задачи такое: написать функцию печатающая...

Передвижение коня по доске и сбор букв - C++
Добрый день! Не могу разобраться, в чём проблема =( Нужно решить задачу: есть шахматная доска. На ней, в каждой клетке,...

Покрытие шахматной доски ходом коня - C++
4. Покрытие шахматной доски ходом коня.


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
26.11.2012, 18:25     Похождения коня #9
Цитата Сообщение от kciosdse Посмотреть сообщение
Только хотелось бы уточнить - вы указателю присвоили значение адреса статического массива? И ещё, где-то читал что память выделяется функцией "new".
Я просто не знаю, зачем Вам нужны данные указатели, поэтому инициализировал их адресами массивов. Если же, Вам нужно выделение памяти, то необходимо выделять память с помощью new (malloc)
Yandex
Объявления
26.11.2012, 18:25     Похождения коня
Ответ Создать тему
Опции темы

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