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

Ввод матрицы вручную - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Взаимодействие сайтов и VC++ http://www.cyberforum.ru/cpp-beginners/thread223094.html
Добрый вечер. Всех с наступившим! Нужна подсказка: где можно почитать про взаимодействие приложения с вебсайтом (получение куки, парсинг кода, отправка форм и тд). Буду благодарен за любую...
C++ Определить три соседних дня с максимальной средней температурой Помогите решить полностью следующие задачи. 1.Начиная с понедельника, 1-го сентября, в течение 3-х недель один раз в день измеряется значение температуры. Таким образом, формируется двумерный массив... http://www.cyberforum.ru/cpp-beginners/thread223089.html
Ошибка в char... C++
Делаю программу. Одна из функций - открытие заданого файла: char *aud="magazine/"+ThisClass.c_str()+".xls"; char *path="magazine/"; ShellExecute(NULL,NULL,aud,path,NULL,SW_SHOW); ThisClass...
C++ дескрипторы у пайпов
Во- первых, хочу поздравить всех с новым годом)))) итак, проблема в следующем: пишу чат на пайпах, использующий аутентификацию по керберосу... при создании сервером пайпа - клинет не может...
C++ Стандарты и стили языков программирования http://www.cyberforum.ru/cpp-beginners/thread223045.html
Занимаясь программирование, например С++, иногда задумываешься, читая различную литературу и разбирая чужие коды программ, что большинство программистов, как начинающих, так и уже вполне опытных,...
C++ компиляция программы на с Привет всем. У меня такая проблема. Я написал программу на С именно на С а не на С++. Написал я её в notepad++ а вот скомпилировать немогу. Есть у меня Visual Studio 2005, но как скомпилировать на... подробнее

Показать сообщение отдельно
apachan
13 / 13 / 2
Регистрация: 07.12.2010
Сообщений: 127

Ввод матрицы вручную - C++

01.01.2011, 20:45. Просмотров 6173. Ответов 31
Метки (Все метки)

Возможно ли в данной программе сделать ввод матрицы ручным способом (или с помощью рандома, как-то удобнее будет) и введение пользователем координат начала пути и конца? Код пока для меня слишком сложный и сколько ни пытался - ни получилось...

Видимо, нужно добавить:

это и

C++
1
2
3
4
5
6
      {srand(time(0));
                
                cout<<" Labirint  "<<endl;
                for (int i=0; i<N; i++)
                        for (int j=0;j<M;j++)
                                Matr[i][j] = rand()%2;}
собственно, ввод

rowS
colS
rowE
colE


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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream.h>
#include <iomanip.h>
#define    max_(a, b)  ((a)>(b)?(a):(b))
#define    min_(a, b)  ((a)<(b)?(a):(b))
const int  N =    8,         // число строк
           M =    8;         // и столбцов в матрице
const int  x =  1;         // численное значение клетки-"препятствия"
const int  E =    1,         // конечная
           S =   -1;         // и начальная точки
// исходная матрица: пустые клетки - нули, "препятствия" - x
// Конечная точка - E (coord: rowE,colE), исходная - S (rowS,colS)
int  Matr[N][M] = { 
    { x,  0,  0,  0,  x,  0,  E,  x },
    { 0,  0,  x,  0,  x,  0,  0,  0 },
    { 0,  x,  x,  0,  0,  0,  x,  0 },
    { 0,  0,  0,  x,  x,  x,  0,  0 },
    { 0,  0,  0,  0,  0,  0,  0,  0 },
    { 0,  x,  0,  x,  0,  x,  0,  0 },
    { 0,  0,  x,  0,  0,  0,  x,  0 },
    { x,  0,  S,  x,  0,  0,  0,  0 }
};
int    rowS  = 7,              // координаты начальной
       colS  = 2,    
       rowE  = 0,              // и конечной точки
       colE  = 6;
void   OutMatr();                                                 
void   OutWay(int matr[][M], int rS, int cS);
int    main()
{
          // копия исходной матрицы    
    int   Matrix[N][M];          
    int   i, j;
    for(i = 0; i < N; i++)
        for(j = 0; j < M; j++)
            Matrix[i][j] = Matr[i][j];
    int   n,
          Finish    = false,
          // координаты начала пути (если < 0 - пути нет)
          rS        = -1,      
          cS        = -1;
    
          // смещение
    int   offset[8] = { -1,0, 1,0, 0,-1, 0,1 };
    
          // координаты прямоугольника для поиска клеток со значением n
    int   startRow  = rowE,    
          endRow    = rowE,        
          startCol  = colE,
          endCol    = colE;
    // вывод исходного состояния матрицы
    OutMatr();                 
    // Цикл поиска клеток со значением n и заполнения соседних пустых (0) клеток
    // значением n + 1. Цикл завершается, когда нечего уже заполнять или достигнута
    // стартовая точка (со значением S)
    for(n = E; !Finish; n++)
    {
        Finish = true;
        for(i = startRow; i <= endRow; i++)
        {
            for(j = startCol; j <= endCol; j++)
            {
                if(Matrix[i][j] == n)
                {                      
                    for(int k = 0; k < 8; k += 2)
                    {
                        // проверяем значение клеток слева, справа, сверху и снизу
                        if( i + offset[k]     >= 0  && 
                            i + offset[k]     <  N  && 
                            j + offset[k + 1] >= 0  &&
                            j + offset[k + 1] <  M )
                        {
                            // и, если клетка существует и не занята (0), 
                            if(Matrix[i + offset[k]][j + offset[k + 1]] == 0)
                            {
                                // заносим n + 1
                                Matrix[i + offset[k]][j + offset[k + 1]] = n + 1;
                                Finish = false;
                            }
                            // если достигнута начальная точка (S) - запоминаем    координаты
                            // текущей точки(i, j), как начала пути(rS, cS)
                            else if(Matrix[i + offset[k]][j + offset[k + 1]] == S)
                            {
                                rS = i;
                                cS = j;
                                
                                // и выходим из всех циклов
                                goto Finish;
                            }
                        }
                    }  
                }
            }  
        }
        
        startRow   =   max_(0    , startRow - 1);
        endRow     =   min_(N - 1, endRow   + 1);
        startCol   =   max_(0    , startCol - 1);
        endCol     =   min_(M - 1, endCol   + 1);
    }  
Finish:
    if(rS >= 0)                                    // путь найден
    {
        OutWay(Matrix, rS, cS);
        OutMatr();
    }
    else
        cout << " \n\n\nbla - bla - bla \n\n";       // путь не найден, делай что хочешь
    cout << endl;
    return 0;
}
void OutMatr()
{
    static int k = 1;
    cout << (k-- ? "Source matrix:\n" : "\n\n\nOutput of the way:\n");
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < M; j++)
            cout << setw(5) << Matr[i][j];
        cout << endl;
    }
}
// Вывод пути:
// от точки rS, cS - к ближайшей (со значением на 1 меньше),
// от нее-к следующей (на 1 меньше) и т.д.-до конечной (E)
void OutWay(int matr[][M], int rS, int cS)
{
    int   rW  = rS,
          cW  = cS;
    Matr[rW][cW] = -1;
    while(matr[rW][cW] != E)
    {
        if(rW > 0 && matr[rW - 1][cW] == matr[rW][cW] - 1)
            Matr[--rW][cW] = -1;
        else if(rW < M - 1 && matr[rW + 1][cW] == matr[rW][cW] - 1)
            Matr[++rW][cW] = -1;
        else if(cW < N - 1 && matr[rW][cW + 1] == matr[rW][cW] - 1)
            Matr[rW][++cW] = -1;
        else if(cW > 0 && matr[rW][cW - 1] == matr[rW][cW] - 1)
            Matr[rW][--cW] = -1;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru