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

Разрезание шахматной доски - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Репетитор http://www.cyberforum.ru/cpp-beginners/thread271569.html
Ищу онлайн репетитора по С++.Естественно с оплатой.
C++ Запуск приложения с условием и параметром Народ, интересует вот такая вещь. Есть у кого код или кто нить может это написать: Программка при наличии проверяет наличие нужного файла и запускает другой файлик с параметром. Например 1.exe - необходимый файлик для запуска, если его нет то программа не запускает 2.exe, если есть то программа запускает 2.exe с пареметром -ip 127.0.0.1 http://www.cyberforum.ru/cpp-beginners/thread271566.html
C++ Работа с файлами
Помогите, пожалуйста понять в чем ошибка. Данный код реализует такой мини органайзер, с возможностями записи и считывания заданий, но при выборе пункта меню "запись нового задания", либо "текущее время" программа не срабатывает. Выдает либо "записей нет", либо (в случае со временем) завершает свою работу. Спасибо всем, кто пытается помочь.#include <iostream> #include <windows.h> #include...
C++ Не вызывается функция по поиску цифр из заданной строки
Никак не могу найти,где ошибка! Вроде все работает, а вот функция по поиску цифр из заданной строки не вызывается.. #include<iostream> #include<string.h> #include<stdio.h> using namespace std; //Функция поиска больших символов void big(char *line) { char *symbols = new char; int count1 = 0;
C++ Проверить, является ли введенная с клавиатуры квадратная матрица "магическим" квадратом http://www.cyberforum.ru/cpp-beginners/thread271560.html
Написать программу, которая проверяет, является ли введенная с клавиатуры квадратная матрица "магическим" квадратом. "Магическим" квадратом называется матрица, у которой сумма чисел каждом горизонтальном ряду, в каждом вертикальном и по каждой из диагоналей одна и та же приведенный ниже рисунок). Размер матрицы 3х3. 2 9 4 7 5 3 6 1 8 Решить надо через Си Указатель Динамика плиз!! ...
C++ Программа сровнения сразу извинюсь за столь дерзкую просьбу, ибо изучать язык только начал и такие программы мне не по силам. вообщем нужно сделать программу : "Даны даты каждого из 20-ти событий,произошедших после 1930 года: год, номер месяца и число. Составить программу,сравнивающую два любых события по времени (определяющую, какое из событий произошлопозже). Событие может быть представлено: а) условным порядковым... подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
07.04.2011, 22:19     Разрезание шахматной доски
Цитата Сообщение от Arclay Посмотреть сообщение
Вот программа работает, но преподаватель говорит, что лишку результатов выдаёт при n = 8, нужно где-то 27000, а у меня 92000 Это много... очень много. Вот я и думаю, где ошибка?
У меня тоже получилось 92263. Может преподаватель что-то путает?
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
/////////////////////////////////////////////////////////////////////////////////////////
//Написать программу нахождения всех способов разрезания шахматной доски 
//с числом клеток nxn (n-четное) на две одинаковые по форме части 
//(не считая вращений и отражений).
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::vector<int>    T_row;
typedef std::vector<T_row>  T_lattice;
/////////////////////////////////////////////////////////////////////////////////////////
const int  BOARD_DIM_MIN = 2;
const int  BOARD_DIM_MAX = 10;
const int  EMPTY_CELL    = 0;
/////////////////////////////////////////////////////////////////////////////////////////
void  set_next_path_cell
    (
        T_lattice  lattice,
        int        row,
        int        col,
        int        cell_ind,
        bool       path_contains_turns,
        int&       paths_counter
    )
{ 
    int  board_dim                             = lattice.size() - 1;    
    lattice[row][col]                          = cell_ind;
    lattice[board_dim - row][board_dim - col]  = cell_ind;
    
    //Если достигли края доски, то:
    if(   row % board_dim == 0
       || col % board_dim == 0)
    {
        ++paths_counter;
        return;
    }    
    
    for(int  i = row - 1; i <= row + 1; ++i)
    {
        for(int  j = col - 1; j <= col + 1; ++j)
        {            
            //Проверяем, что это недиагональный переход:
            if(   i != row
               && j != col)
            {
                continue;
            }
 
            if(lattice[i][j]  == EMPTY_CELL)
            {
                //Проверяем, чтобы первый шаг был вправо.
                if(   cell_ind == 1
                   &&    (i != board_dim / 2
                      ||  j != board_dim / 2 + 1) )
                {
                    continue;
                }
 
                //Проверяем, чтобы первый поворот был левым.
                bool  new_path_contains_turns = path_contains_turns;
                if(!new_path_contains_turns)
                {
                    if(i > board_dim / 2)
                    {
                        continue;
                    }
 
                    if(i < board_dim / 2)
                    {
                        new_path_contains_turns = true;
                    }
                }
                set_next_path_cell
                    (
                        lattice,
                        i,
                        j,
                        cell_ind + 1,
                        new_path_contains_turns,
                        paths_counter
                    );
            }//if(lattice[i][j]  == EMPTY_CELL)
        }//for(int  j = col - 1; j <= col + 1; ++j)    
    }//for(int  i = row - 1; i <= row + 1; ++i)
}
/////////////////////////////////////////////////////////////////////////////////////////
int  get_board_cutting_paths_total(int  board_dim)
{
    int  paths_counter = 0;
    T_lattice   lattice(board_dim + 1, T_row(board_dim + 1, EMPTY_CELL));
    set_next_path_cell
        (
            lattice,
            board_dim / 2,
            board_dim / 2,
            1,
            false,
            paths_counter
        );
    return paths_counter;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    int  board_dim = 0;
    for(;;)
    {
        do
        {
            std::cout << "Введите четную размерность доски ("
                      << BOARD_DIM_MIN
                      << ".."
                      << BOARD_DIM_MAX
                      <<"): ";
 
            std::cin >> board_dim;       
        }while(   board_dim      % 2 != 0
               || board_dim      < BOARD_DIM_MIN
               || BOARD_DIM_MAX  < board_dim);
 
        std::cout << "Шахматную доску размером "
                  << board_dim
                  << " x "
                  << board_dim
                  << " можно разрезать на две одинаковые по форме части "
                  << "(не считая вращений и отражений) "
                  << get_board_cutting_paths_total(board_dim)
                  << " способами."
                  << std::endl
                  << std::endl
                  << std::endl
                  << std::endl;
    }   
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru