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

коротчайший путь - C++

Восстановить пароль Регистрация
 
im_Kudrik
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 20
13.12.2011, 18:27     коротчайший путь #1
задается массив NxN нужно найти коротчайший путь от позиции 1х1 до NxN и обозначить путь символом # а все остальное символов - .коротчайший путь считается тот ,сумма чисел которых минимальна и двигаться можно только вправо и вниз .
пример
вводим вывод
3
943 #--
216 ###
091 --#
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2011, 18:27     коротчайший путь
Посмотрите здесь:

C++ Путь
C++ Путь к файлу
C++ Длинный путь
Путь к файлу C++
Дальнейший путь C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
13.12.2011, 20:51     коротчайший путь #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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#define N 100
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);     
    int mas[N][N], mas1[N][N], i, j, n;
    char mas_res[N][N];
    scanf("%d", &n);
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
        {
            scanf("%d", &mas[i][j]);
            mas_res[i][j]='-';
        }
    mas1[0][0]=mas[0][0];
    for(i=1; i<n; i++)
    {
        mas1[i][0]=mas[i][0]+mas1[i-1][0];
        mas1[0][i]=mas[0][i]+mas1[0][i-1];
    }
    for(i=1; i<n; i++)
        for(j=1; j<n; j++)
        {
            if(mas1[i-1][j]<=mas1[i][j-1])
                mas1[i][j]=mas[i][j]+mas1[i-1][j];
            else
                mas1[i][j]=mas[i][j]+mas1[i][j-1];
        }
    i=n-1; j=n-1;
    mas_res[n-1][n-1]='#';
    while(!(i==0 && j==0))
    {
        if(i==0)
        {
            j--;            
        }
        else
        {
            if(j==0)
                i--;
            else
            {
                if(mas1[i-1][j]==mas1[i][j]-mas[i][j])
                    i--;
                else
                    j--;
            }
        }
        mas_res[i][j]='#';
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
            printf("%c", mas_res[i][j]);
        printf("\n");
    }
        return 0;
}
В этом коде:
- максимальное N не более 100
- ввод данных из файла input.txt, вывод данных в файл output.txt
- при вводе данных, например:
Цитата Сообщение от im_Kudrik Посмотреть сообщение
3
9 4 3
2 1 6
0 9 1
между числами обязательны пробелы.
im_Kudrik
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 20
14.12.2011, 09:57  [ТС]     коротчайший путь #3
спасибо большое ))

Добавлено через 12 часов 35 минут
а можно как то без пробелов??
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
14.12.2011, 10:32     коротчайший путь #4
Цитата Сообщение от im_Kudrik Посмотреть сообщение
а можно как то без пробелов??
можно:
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 <stdio.h>
#define N 100
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);     
        int mas[N][N], mas1[N][N], i, j, n;
        char mas_res[N][N], c;
        scanf("%d\n", &n);
        for(i=0; i<n; i++)
        {
                for(j=0; j<n; j++)
                {
                        scanf("%c", &c);
                        mas[i][j]=(int)(c-'0');
                        mas_res[i][j]='-';
                }
                scanf("\n");
        }
        mas1[0][0]=mas[0][0];
        for(i=1; i<n; i++)
        {
                mas1[i][0]=mas[i][0]+mas1[i-1][0];
                mas1[0][i]=mas[0][i]+mas1[0][i-1];
        }
        for(i=1; i<n; i++)
                for(j=1; j<n; j++)
                {
                        if(mas1[i-1][j]<=mas1[i][j-1])
                                mas1[i][j]=mas[i][j]+mas1[i-1][j];
                        else
                                mas1[i][j]=mas[i][j]+mas1[i][j-1];
                }
        i=n-1; j=n-1;
        mas_res[n-1][n-1]='#';
        while(!(i==0 && j==0))
        {
                if(i==0)
                {
                        j--;                    
                }
                else
                {
                        if(j==0)
                                i--;
                        else
                        {
                                if(mas1[i-1][j]==mas1[i][j]-mas[i][j])
                                        i--;
                                else
                                        j--;
                        }
                }
                mas_res[i][j]='#';
        }
        for(i=0; i<n; i++)
        {
                for(j=0; j<n; j++)
                        printf("%c", mas_res[i][j]);
                printf("\n");
        }
        return 0;
}
im_Kudrik
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 20
14.12.2011, 10:59  [ТС]     коротчайший путь #5
огромное вам спасибо ,но мне кажется если считывать char массив и дальше работать с int так будет лучше ,как вы думаете ?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
14.12.2011, 12:10     коротчайший путь #6
Цитата Сообщение от im_Kudrik Посмотреть сообщение
огромное вам спасибо ,но мне кажется если считывать char массив и дальше работать с int так будет лучше ,как вы думаете ?
Можно и так.
Yandex
Объявления
14.12.2011, 12:10     коротчайший путь
Ответ Создать тему
Опции темы

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