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

Соединение отрезков - C++

Восстановить пароль Регистрация
 
BOR1K
 Аватар для BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
06.02.2010, 12:22     Соединение отрезков #1
Дан массив целых чисел x[1]..x[m+n], рассматриваемый как соединение двух его отрезков:
начала x[1]..x[m] длины m и конца x[m+1]..x[m+n] длины n. Не использую дополнительных массивов переставить начало и конец.(число действий порядка m+n);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2010, 12:22     Соединение отрезков
Посмотрите здесь:

минимальное подмножество отрезков C++
C++ Поиск отрезков
Пересечение отрезков. C++
Длина отрезков C++
C++ Пересечение отрезков
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
06.02.2010, 13:07     Соединение отрезков #2
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
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int n, m, i, j;
    int *mas;
    std::cout<<"Введите m:\n> ", 
        std::cin>>m;
    std::cout<<"Введите n:\n> ", 
        std::cin>>n;
    mas = new int[n + m];
 
    for(i = 0; i < m + n; ++i)
        mas[i] = rand()%10;
 
    std::cout<<"Массив:\n";
    for(i = 0; i < m + n; ++i)
        std::cout<<mas[i]<<' ';
    
    int buf;//вот здесь начинается суть задания
    for(i = 0; i < m; ++i)
    {
        buf = mas[0];
        for(j = 0; j < m + n - 1; ++j)
            mas[j] = mas[j + 1];
        mas[m + n - 1] = buf;
    }//здесь заканчивается
    std::cout<<"Результат:\n";
    for(i = 0; i < m + n; ++i)
        std::cout<<mas[i]<<' ';
 
    fflush(stdin);
    std::cin.get();
    return EXIT_SUCCESS;
}
axel_
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 14
06.02.2010, 13:17     Соединение отрезков #3
Вот один из способов, но количество действий в нём m*n, а не m+n.
Пусть есть такой массив: ABCDabcdefg, соответственно m = 4, n = 7.
Для решения задачи нужно, чтобы блок abcdefg сместился влево, а блок ABCD - вправо, и результат должен быть abcdefgABCD (если я правильно понял задачу).
Все элементы блока abcdefg можно "протащить" влево, последовательно меняя местами с предыдущим элементом. Таких перестановок для каждого элемента из abcdefg понадобиться столько, сколько элементов в блоке ABCD (т.е. m перестановок). Порядок действий будет таков:

ABCDabcdefg // исходный массив, далее a меняется местами с D (делается swap)
ABCaDbcdefg // a сметился влево на одну позицию, далее a меняется местами с С (делается swap)
ABaCDbcdefg // ...
AaBCDbcdefg // ...
aABCDbcdefg // итак, за 4 перестановки (размер ABCD) элемент а сметился в самое начало, а блок
// ABCD полностью сметился вправо на одну позицию (порядок элементов сохранён)
// далее смещаем элемент b
aABCbDcdefg
aABbCDcdefg
aAbBCDcdefg
abABCDcdefg // блок ABCD сместился ещё на одну позицию, далее всё то же самое для с
. . . . . . . . .
abcdefgABCD // за m*n перестановок достигнут желаемый результат

Добавлено через 6 минут
Во, пока я писал, уже готовое решение дали. Но это тоже не m+n операций.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
06.02.2010, 13:18     Соединение отрезков #4
Хм.. мой код можно немного оптимизировать, заменив строки 21-28 на такие
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int buf;
if(m < n)
    for(i = 0; i < m; ++i)
    {
        buf = mas[0];
        for(j = 0; j < m + n - 1; ++j)
            mas[j] = mas[j + 1];
        mas[m + n - 1] = buf;
    }
else
    for(i = 0; i < n; ++i)
    {
        buf = mas[m + n - 1];
        for(j = m + n - 1; j > 0; --j)
            mas[j] = mas[j - 1];
        mas[0] = buf;
    }
Yandex
Объявления
06.02.2010, 13:18     Соединение отрезков
Ответ Создать тему
Опции темы

Текущее время: 16:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru