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

Минимальное количество белых слонов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Разложение числа http://www.cyberforum.ru/cpp-beginners/thread529513.html
Условие Заданы три числа а, b, с. Можно ли представить число а таким образом, что а = х1 ⋅ х2 ⋅ … ⋅ хk, где b ≤ хi ≤ c и хi, а, b, с — целые числа? Лучшим считается алгоритм, находящий такое представление с наименьшим числом множителей. Предусмотреть вариант, когда такого представления не существует. Входные данные подготовлены в файле input.txt, который содержит строку, содержащую числа...
C++ Списки: что такое и с чем едят? Сейчас тупо втыкаю в 4 часть учебника Полякова по Си. В самом начале про списки. Почему тупо-потому, что не понимаю: что такое, и зачем оно вообще надо? Может кто-нибудь доходчиво объяснит? http://www.cyberforum.ru/cpp-beginners/thread529512.html
Деревья. C++
Условие Найти и удалить (правым удалением), если существует, среднюю по значению из вершин дерева, у которых количество потомков в левом поддереве отличается от количества потомков в правом поддереве наибольшим образом. Если у вершины отсутствует некоторое поддерево, то количество потомков в этом поддереве будем полагать равным 0. Входные данные tst.in содержит последовательность ключей...
создание класса C++
Создайте класс bMoney, в котором перегрузите арифметические операции для работы с денежным форматом. Перегрузите два оператора следующим образом: long double * bMoney //умножить число на деньги long double / bMoney //делить число на деньги Эти операции требуют наличия дружественных функций, так как справа от оператора находится объект, а слева –...
C++ Рекурсия: сумма ряда http://www.cyberforum.ru/cpp-beginners/thread529497.html
Здравствуйте. Помогите написать программу: В основном трудности возникли с Ak и Bk. Заранее благодарен.
C++ Даны натуральные числа a,b(a<= Ь). Получить все простые числа р, удовлетворяющие неравенствам a<= р<= b. Даны натуральные числа a,b(a<= Ь). Получить все простые числа р, удовлетворяющие неравенствам a<= р<= b. Решите на С++. Буду очень благодарна! подробнее

Показать сообщение отдельно
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.03.2012, 13:59     Минимальное количество белых слонов
Моё решение. Проверял на двух файлах - работает.
файл in.txt
C++
1
2
3
4
5
6
7
8
9
8 6
 0  0  0  0  0  0
 0 -1  0 -1  0 -1
-1  0  0 -1  0  0
 0  0  0 -1 -1  0
 0 -1 -1 -1 -1  0
 0 -1  0  0  0 -1
 0  0 -1 -1  0  0
 0  0  0  0  0  0
файл in2.txt (тестовый заполненный нулями)
C++
1
2
3
4
5
6
7
8
9
8 6
 0  0  0  0  0  0
 0  0  0  0  0  0
 0  0  0  0  0  0
 0  0  0  0  0  0
 0  0  0  0  0  0
 0  0  0  0  0  0
 0  0  0  0  0  0
 0  0  0  0  0  0
Программа сама
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
#include <iostream> 
#include <fstream>
using namespace std;
const int MAXSIZE = 1000;
int width, height;
int board[MAXSIZE][MAXSIZE];
void load_board(){
    int i, j;
    ifstream txt;
    txt.open("in.txt");
    if (!txt) cout<<"Error opening in.txt"<<endl;
    txt>>height>>width;
    if ((height<2)||(height>MAXSIZE)||(width<2)||(width>MAXSIZE)){
        cerr<<"Error: invalid board size"<<endl;
    }
    for (i=0; i<height; i++)
        for (j=0; j<width; j++)
            txt>>board[j][i];
    txt.close();
}
void show_board(){
    int i, j;
    for (i=0; i<height; i++){
        for (j=0; j<width; j++)
            if (board[j][i]==-1)
                cout<<"# ";
            else
                cout<<board[j][i]<<" ";
        cout<<endl;
    }
}
void paint(int x, int y, int c){
    board[x][y]=c;
    if (y<height-1){
        if (x<width-1) if (board[x+1][y+1]==0) paint(x+1, y+1, c);
        if (x>0)       if (board[x-1][y+1]==0) paint(x-1, y+1, c);
    }
    if (y>0){
        if (x>0)       if (board[x-1][y-1]==0) paint(x-1, y-1, c);
        if (x<width-1) if (board[x+1][y-1]==0) paint(x+1, y-1, c);
    }
}
int solve(){
    int color=0;
    int i, j;
    for (j=0; j<width; j++)
        for (i=0; i<height; i++)
            if (board[j][i]==0)
                paint(j, i, ++color);
 
    return color;
}
int main(){
    char c;
    load_board();
    cout<<"given board: "<<endl;
    show_board();
    cout<<"elephants needed: "<<solve()<<endl;
    cout<<"solved board "<<endl;
    show_board();
    cin>>c;
    return 0;
}
результат работы
http://hostingkartinok.com/show-imag...47f413d9e56203

Добавлено через 3 минуты
Цитата Сообщение от valeriikozlov Посмотреть сообщение
рекурсией можно решить эту задачу, но рекурсия является не единственным вариантом решения.

Да, ты прав на счёт рекурсии. По условию говорится, что поле может быть 1000 на 1000 при моём рекурсивном решении это точно переполнит стек!
 
Текущее время: 13:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru