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

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

Войти
Регистрация
Восстановить пароль
 
shocoladka
7 / 7 / 0
Регистрация: 02.12.2010
Сообщений: 71
#1

Стена - C++

04.02.2011, 21:17. Просмотров 835. Ответов 2
Метки нет (Все метки)

Вот условие задачи:
Однажды майор Пронин затеял в квартире ремонт. В одной из стен на кухне по плану потребовалось последовательно проделать (N–1) прямоугольных вентиляционных отверстий с горизонтальными и вертикальными сторонами (0 < N < 101). Если оказывалось, что очередное отверстие пересекается с уже проделанными, то майор вырезал только нетронутую часть соответствующего прямоугольника.

Следующая стадия после ремонта – это поклейка обоев. В магазине напротив майор может заказать не более (2N–1)2 прямоугольных кусков обоев любых размеров c ненулевой площадью. Он хочет обклеить стену кусками обоев так, чтобы:

1. Вентиляционные отверстия не были заклеены даже частично.

2. Никакие два куска не пересекались (касаться сторонами они при этом могут).

3. На стене не осталось бы непокрытой области.

Формат входных данных

Рассмотрим декартову систему координат, оси которой параллельны сторонам отверстий и стены.

Сначала вводится число N (0 < N < 101), далее – описание N прямоугольников. Первый прямоугольник описывает положение стены в нашей системе координат, остальные (N–1) ― положения отверстий в порядке их появления. Стороны всех прямоугольников параллельны осям координат. Каждый прямоугольник задаётся координатами своих левого нижнего и правого верхнего углов: x1, y1, x2, y2. Координаты — целые числа, не превосходящие по модулю 31000, x1 < x2, y1 < y2.

Прямоугольники, обозначающие положение отверстий, могут пересекаться и касаться, поскольку это могло быть необходимо в ходе ремонта. Разумеется, все вентиляционные отверстия находятся в стене, то есть не выходят за границы первого прямоугольника.

Формат выходных данных

Вначале выведите количество кусков обоев K, которое нужно заказать в магазине (K должно быть не больше (2N–1)2). Далее выведите схему поклейки: K прямоугольников, обозначающих места расположения заказанных кусков. Для каждого прямоугольника нужно вывести координаты его левого нижнего и правого верхнего углов. Все координаты должны быть целыми числами. Гарантируется, что решение существует.

Если возможных способов несколько, выведите любой.



Я её написал но уверен что можно существенно короче и хотелось бы узнать как)
Вот если что моё решение(формат вывода немного отличается от формата в условии но это ничего )) )

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
#include <iostream>
using namespace std;
int kor[10001][10001];
bool nextline(int j,int a)
{
 
    for(int i=0;i<=a;i++)
        if(kor[j][i]!=kor[j+1][i])
            return false;
    return true;
}
bool line(int j,int a)
{
    for(int i=0;i<=a;i++)
        if(kor[j][i]!=0)
            return false;
    return true;
}
bool ost(int b,int j,int a)
{
    if(b>a)
    return false;
    for(int i=b;i<=a;i++)
        if(kor[j][i]!=1)
            return false;
    return true;
}
int main()
{
    int n;
    cin>>n;
    int x1,x2,y1,y2,a,b,c,d;
    cin>>x1>>y1>>x2>>y2;
    for(int j=0;j<=y2-y1;j++)
    for(int i=0;i<=x2-x1;i++)
    {
        kor[j][i]=0;
    }
    for(int g=1;g<n;g++) {
    cin>>a>>b>>c>>d;
    for(int j=a-y1;j<=c-y1;j++)
    for(int i=b-x1;i<=d-x1;i++)
    kor[j][i]=1;
    }
    for(int j=0;j<=y2-y1;j++,cout<<endl)
    for(int i=0;i<=x2-x1;i++)
    cout<<" "<<kor[j][i]<<" ";
    int i=0;
    int j=0;
    int g;
    while(j<=y2-y1)
    {
        if(line(j,x2-x1)) {
        cout<<j+y1<<" "<<0+x1<<" ";
        while(line(j+1,x2-x1) && j<y2-y1)
        j++;
        cout<<j+y1<<" "<<x2<<endl; j++; }
        else {
        while(kor[j][i]==1)
        if(i<=x2-x1)
            i++;
        else {
            j++; i=0; }
        cout<<j+y1<<" "<<i+x1<<" ";
        g=j;
        int b=i;
        while(true) {
        if(i<x2-x1 && kor[g][i+1]==0) {
            i++; }
        else {
                if(i==x2-x1)
                j++;
                if(!nextline(g,x2-x1))
                break;
                i=b;
                g++;        } }
        cout<<g+y1<<" "<<i+x1<<endl;
        if(ost(i+1,j,x2-x1)) {
        while(nextline(j,x2-x1))
        j++; j++; i=-1;}
        if(i==x2-x1)
        i=-1;
        i++; }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2011, 21:17     Стена
Посмотрите здесь:

Стена! - DLE
Как сделать стену на подобии вк или твиттер? за ранее спс

Стена как в вк - Delphi
Всем привет. Щас делаю проект с подключением vk api, и мне надо сделать вывод постов страницы в delphi, как написать код на вывод данных...

Стена как ВК - PHP БД
Добрый вечер! Подскажите. На сайте есть у пользователей стена. В БД записывается ID, текст и ник автора записи на стене. Подскажите как...

Стена пользователей - PHP
Ставил плагин на свой скрипт и вот в чём проблема: когда кому-то оставляешь запись на стене, то под твоим комментарием показывает аву и...

Стена с плиткой - Обо всем!
Всем привет. Нужна программа что бы наглядно посмотреть как будет выглядеть стена с керамической плиткой. Не хочется что то...

Стена с сообщениями - PHP
Такой вопрос, у меня есть небольшая социальная сеть, но я не представляю как сделать там стену с сообщениями. Да так что бы ещё...

Ашарик, стена, проекция - Механика
Летит шарик. Шарик массой м. Ударяеться о стену под углом альфа (=30 градусов, но может быть и другое число) Отлетает от стены под...

Стена из Вконтакте в Delphi - Delphi
Ребят, мне очень нужно написать программу, где я мог бы просматривать только стену определённой группы из Вконтакте. Пару дней сидел думал,...

Стена пользователя як в Вкантакте - HTML, CSS
здрастуйте я делаю шаблон на юкоз мне нужна помощь по настройке стени пользователя ето щас у мекня так на сайте а мне нада вот...

Решить ребус - БЛОК*7=СТЕНА - Pascal ABC
Расшифровать ребус, полученный в результате замены одинаковых букв одинаковыми цифрами. БЛОК*7=СТЕНА Вроде правилно написано, но что-то...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shocoladka
7 / 7 / 0
Регистрация: 02.12.2010
Сообщений: 71
07.02.2011, 20:16  [ТС]     Стена #2
и что так никто и не поможет?((
Тогда хотя бы подскажите где помогут)
shocoladka
7 / 7 / 0
Регистрация: 02.12.2010
Сообщений: 71
08.02.2011, 20:48  [ТС]     Стена #3
.....
Yandex
Объявления
08.02.2011, 20:48     Стена
Ответ Создать тему
Опции темы

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