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

Дайте совет по оптимизации - C++

Восстановить пароль Регистрация
 
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 20:24     Дайте совет по оптимизации #1
Необходимо оптимизировать реализацию морского боя.
Изначально поле представлял в виде символьного массива, естественно длинной 10х10
при этом каждое обращение к элементу массива (х,у) сопровождалось вычислениями величины 10*y+x.
Можно попробовать заменить его на двумерный
так вот, хотелось бы узнать, действительно ли это даст нам преимущество во времени?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 20:24     Дайте совет по оптимизации
Посмотрите здесь:

C++ Дайте совет :)
C++ Дайте совет по изучению программирования
C++ Цветной рисунок в С++ консоль, Дайте совет!!
Разрженные матрицы дайте совет C++
Среда разработки. Дайте совет C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
08.01.2012, 20:27     Дайте совет по оптимизации #2
символьного массива
Может лучше массив из bool?
true = корабль есть
false = нет или он/его часть в этой клетки убита
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
08.01.2012, 20:29     Дайте совет по оптимизации #3
Доступ к одномерному массиву a[i] производиться так:
*(a+i)
а к двумерному a[i][j]
*(*(a+i)+j)
Как видите, и там(двумерный) и там(*(a+(10*y+x))) умножение

Цитата Сообщение от somebody11 Посмотреть сообщение
Можно попробовать заменить его на двумерный
Попробуйте. Вполне возможно, что читабельность кода возрастет, хотя может быть я и не прав.
Цитата Сообщение от somebody11 Посмотреть сообщение
Необходимо оптимизировать реализацию морского боя.
Код собственно не покажете?
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 20:30  [ТС]     Дайте совет по оптимизации #4
Цитата Сообщение от hepr Посмотреть сообщение
Может лучше массив из bool?
true = корабль есть
false = нет или он/его часть в этой клетки убита
Дело в том, что вся работа проги завязана на символьных обозначениях, тем более Вы забыли про ранен или мимо
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
08.01.2012, 20:35     Дайте совет по оптимизации #5
забыли про ранен или мимо
Пользователь попадает в клетку с true, далее проверяем клетки вверху внизу справа снизу, если там хоть одна true, то ранил, если нет о убил
Если пользователь выбирает клетку с false, то мимо
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
08.01.2012, 20:40     Дайте совет по оптимизации #6
dimcoder, я тебе больше скажу, в одномерном при запросе по индексу тоже присутствует умножение(на sizeof(type)), но механизмы доступа у ТС и обычный для двумерного массива от этого одинаковыми не становятся.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
08.01.2012, 20:44     Дайте совет по оптимизации #7
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
#include "iostream"
 
using namespace std;
 
int main()
{
    bool arr[10][10];
    //Генерируем поле
    for (int a=0;a<10;a++)
        for (int b=0;b<10;b++)
        {
            if((a+b)%2==0)
                arr[a][b] = true;
            else
                arr[a][b] = false;
        }
 
    //Цикл обработки
    while(true)
    {
        cout << "Enter x and y of point to kill it or 0 to go away: ";
        int x,y;
        cin >> x;
        if(x==0)
            break;
        cin >> y;
        if(arr[x][y])
        {
            /*Можно добавить код на проверку соседних клеток на возможность ранения*/
            arr[x][y] = false;
            cout << "You kill me, baybe!" << endl;
        }
        else
        {
            cout << "You did not get!" << endl;
        }
    }
    system("pause");
    return 0;
}
Примерный код того что я говорю
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
08.01.2012, 20:47     Дайте совет по оптимизации #8
NoMasters, тогда и при операции (a+i) (из *(*(a+i)+j)), тоже происходит умножение на sizeof(type).
somebody11, код код код код код кодкодкодкодкокдокодкодокодкдокдокдокдодокдокд
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 21:02  [ТС]     Дайте совет по оптимизации #9
Цитата Сообщение от dimcoder Посмотреть сообщение
тогда и при операции (a+i) (из *(*(a+i)+j)), тоже происходит умножение на sizeof(type).
даа, кстати, это был второй семестр, память меня подводит )
Цитата Сообщение от dimcoder Посмотреть сообщение
код код код код код кодкодкодкодкокдокодкодокодкдокдокдокдодокдокд
ну
он большой очень и разбит на несколько срр для удобства работы. впрочем, если пожелаете ознакомиться, можно выложить архивом куда-нибудь

вообще говоря, передо мной стоит задача его оптимизировать по быстродействию и размеру (ну это на второй план). поэтому если подскажете еще что, будет весьма неплохо
агерон
 Аватар для агерон
265 / 264 / 33
Регистрация: 12.10.2009
Сообщений: 1,031
08.01.2012, 21:19     Дайте совет по оптимизации #10
ох уж эти оптимизаторы, оптимизирующие доступ к таблице на 100 элементов, у вас что компы Atari 8086?
лучше бы сделали код более менее читабельным да проверки на ввод данных отпользователя, к примеру так
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
int _tmain(int argc, _TCHAR* argv[])
{
        int x,y;
        bool area[10][10];
        for (int a=0;a<10;a++)
            for (int b=0;b<10;b++)
                area[a][b]=(a+b)%2; 
        do
        {
            do
            {
                cout << "Enter x and y of point to kill it: ";
                cin >> x >> y;
            }
            while ((x<1||x>10)||(y<1||y>10));            
            if(area[x][y])
            {
                area[x][y] = false;
                cout << "You kill me, baybe!" << endl;
            }
            else
            {
                cout << "You did not get!" << endl;
            }
            cout<<"Press Enter for continue"<<endl;
        }
        while (_getch()==13);
        system("pause");
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 21:39     Дайте совет по оптимизации
Еще ссылки по теме:

C++ Профессионалы программирования дайте совет
Дайте совет C++
Дайте совет по продолжению обучения C++

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

Или воспользуйтесь поиском по форуму:
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 21:39  [ТС]     Дайте совет по оптимизации #11
Цитата Сообщение от агерон Посмотреть сообщение
ох уж эти оптимизаторы, оптимизирующие доступ к таблице на 100 элементов, у вас что компы Atari 8086?
дело в том, что алгоритмы расстановки и стрельбы сделаны вполне логично и аккуратно, есть все проверки и прочие мелочи, поэтому нужно за что-то зацепиться, чтобы выполнить поставленную задачу.

Добавлено через 12 минут
кстати говоря
непонятен случай
если мы когда-то подстрелили корабль (он 3х или 4х палубный)
затем опять в него попали - тогда наш алгоритм проверки на ранен-убит дает сбой
Yandex
Объявления
08.01.2012, 21:39     Дайте совет по оптимизации
Ответ Создать тему
Опции темы

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