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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
#1

Добавить размеры в код "Обход конем" - C++

15.01.2013, 23:27. Просмотров 1572. Ответов 43
Метки нет (Все метки)

Господа,решила в новой теме попросить помощи.есть код
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
#include <stdio.h>
#include <conio.h>
#define  size_row 10
#define  size_col 10
 
 
 
int main(void)
{
    
     int Ni=0; 
     int Nk=300;
     int y=255; 
     int n=253; 
     int s=0; 
     int e=254;
     int i,j;
     int R[size_row][size_col]= {            {s,y,y,y,y,y,y,n,n,n},
                                               {n,y,n,n,n,y,y,n,n,n},
                                                {y,y,n,n,n,y,n,n,n,n},
                                                {y,n,e,y,y,y,n,n,n,n},
                                               {y,y,y,n,n,n,n,n,n,n},
                                            {n,n,n,n,n,n,n,n,n,n},
                                               {n,n,n,n,n,n,n,n,n,n},
                                                {n,n,n,n,n,n,n,n,n,n},
                                                {n,n,n,n,n,n,n,n,n,n},
                                                {n,n,n,n,n,n,n,n,n,n} };
 
printf("labyrint pered algoritmem::" "\n \n");
   for (i=0; i < size_row; i++)
{
   for (j=0; j < size_col; j++)
   printf("%d\t",R[i][j]);
}
 
/*vlnovy algoritmus*/
while (Ni < Nk)
{
   for (i=0; i < size_row; i++)
   {
     for (j=0; j < size_col; j++)
     /*spousteni*/
     if (R[i][j]==Ni)
     {
         if (R[i][j+1]==255)
            R[i][j+1]=Ni+1;
         if (R[i][j-1]==255)
            R[i][j-1]=Ni+1;
         if (R[i+1][j]==255)
            R[i+1][j]=Ni+1;
         if (R[i-1][j]==255)
            R[i-1][j]=Ni+1;
         if ((R[i+1][j]==254) || (R[i-1][j]==254) || (R[i][j+1]==254) || (R[i][j-1]==254))
         {  
            //printf(
            //getch(); 
            //return 0; 
            //break;
          
         }
      }
   }
Ni++;
}
 
   printf("\n\n");
 
 
printf ("labyrint posle algoritma:: \n \n");
for (i=0; i < size_row; i++)
{
   for (j=0; j < size_col; j++)
   printf("%d\t", R[i][j]);
}
 
   getch();
   return 0;
}
это обход конем по шахматной доске.к нему нужно прилепить следующее:
-размеры шахматной доски.
-координаты конечного поля.
как это воплотить в жизнь?

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2013, 23:27     Добавить размеры в код "Обход конем"
Посмотрите здесь:

Задача "Тур конем" - C++
На шахматной доске размером на поле с координатами х0, у0 находится конь – фигура, перемещающаяся по обычным шахматным правилам. Задача...

"Рекурсивная функция" (Обход бинарного дерева) - C++
Привет всем, встретился с такой рекурсивной ф-ей, которая обходит бинарное дерево и выводит его на экран. Не могу понять как она работает ...

Обход "End Of File". Работа с файлами - C++
Доброе утро всем! Вопрос таков: Делаю копирование из одного файла в другой, копирование по-символьное, до того как переменная не будет...

предлагаю людям класс "рекурсивный обход матрицы" для решения задач на такую тематику - C++
Друзья! Ввиду возникшей необходимости мной был написан класс &quot;рекурсивный обход матрицы&quot;; Теперь задачи на такую тематику будут решаться...

Обход доски конем - C++
Дана шахматная доска размером 8х8 и шахматный конь. Программа должна запросить у пользователя координаты клетки поля и поставить туда коня....

Обход доски шахматным конем - C++
решал задачу &quot;Тур конем&quot;. : На шахматной доске размером n*n на поле с координатами x0,y0 находится конь - фигура , перемещающаяся по...

Переписать визуальный проект в консольное приложение: Обход конем всех клеток шахматного поля. - C++
Приветствую друзья!Прошу помощи у экспертов, т.к. ООП почти не изучал. Дана программа с исходниками и исполняемым файлом, рабочая, но с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
24.01.2013, 18:00  [ТС]     Добавить размеры в код "Обход конем" #31
Цитата Сообщение от lemegeton Посмотреть сообщение
Да, конечно. Переменные height, width, x и y вполне можно считывать с консоли вместо инициализации константами. Все будет работать.

Вот пример ввода. Сделайте по аналогии.
Обратите внимание на амперсанд перед width в scanf'е. Он очень важен.
C
1
2
3
  int width;
  printf("Enter width: ");
  scanf("%d", &width);
я так у себя и сделала,только вот значений потребовалось вводить больше,чем мне показалось нужным.value ведь тоже нужно инициализировать?

Добавлено через 2 минуты
а каждый раз int писать по идее не нужно,ведь есть строка,которая относит все величины к типу int
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
24.01.2013, 19:27     Добавить размеры в код "Обход конем" #32
Цитата Сообщение от Катерька Посмотреть сообщение
value ведь тоже нужно инициализировать?
Нет-нет. У него "магическое" начальное значение 0. Не надо его вводить. Вообще, суть этого value -- минимальное количество ходов до клетки.

Вообще, я бы на вашем месте сделал функцию вроде такой:
C
1
2
3
4
5
6
int readInteger(const char *message) {
  int result;
  printf("%s: ", message);
  scanf("%d", &result);
  return result;
};
Ну и потом с её помощью проинициализировал все четыре переменные.
C
1
2
3
4
  int height = readInteger("Enter field height");
  int width = readInteger("Enter field width");
  int y = readInteger("Enter start row");;
  int x = readInteger("Enter start column");;
И все, никого больше никуда вводить не надо.
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
25.01.2013, 00:19  [ТС]     Добавить размеры в код "Обход конем" #33
Премногоуважаемый lemegeton, послала ему вот это
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 <stdlib.h>
#include <stdio.h>
#include <time.h>
 
 
 
 
int **newMatrix(int height, int width, int value) {
    
    
    
    
  int i, j;
  int **matrix = (int**)malloc(sizeof(int*) * height);
  for (i = 0; i < height; ++i) {
    matrix[i] = (int*)malloc(sizeof(int) * width);
    for (j = 0; j < width; ++j) {
      matrix[i][j] = value;
    }
  }
  return matrix;
}
 
 
 
 
void deleteMatrix(int **matrix, int height) {
  int i;
  for (i = 0; i < height; ++i)
    free(matrix[i]);
  free(matrix);
}
 
void fillMatrix(int **matrix, int height, int width, int y, int x, int value) {
 
 
 
   
  
    
    
  if (y > -1 && y < height && x > -1 && x < width && (matrix[y][x] > value || matrix[y][x] < 0)) {
    matrix[y][x] = value++;
    fillMatrix(matrix, height, width, y - 1, x - 2, value);
    fillMatrix(matrix, height, width, y + 1, x - 2, value);
    fillMatrix(matrix, height, width, y - 1, x + 2, value);
    fillMatrix(matrix, height, width, y + 1, x + 2, value);
    fillMatrix(matrix, height, width, y - 2, x - 1, value);
    fillMatrix(matrix, height, width, y - 2, x + 1, value);
    fillMatrix(matrix, height, width, y + 2, x - 1, value);
    fillMatrix(matrix, height, width, y + 2, x + 1, value);
  }
}
 
void printMatrix(int **matrix, int height, int width) {
  int i, j;
  for (i = 0; i < height; ++i) {
    for (j = 0; j < width; ++j) {
      printf("%3d", matrix[i][j]);
    }
    printf("\n");
  }
}
 
int printPathRecursive(int **matrix, int height, int width, int y, int x,
  int value) {
  if (x < 0 || x >= width || y < 0 || y >= height || matrix[y][x] != value)
    return 0;
  
  printf("%d/%d ", y, x);
  if (matrix[y][x] > 0) {
    return
      printPathRecursive(matrix, height, width, y - 2, x + 1, value - 1) ||
      printPathRecursive(matrix, height, width, y - 2, x - 1, value - 1) ||
      printPathRecursive(matrix, height, width, y + 2, x + 1, value - 1) ||
      printPathRecursive(matrix, height, width, y + 2, x - 1, value - 1) ||
      printPathRecursive(matrix, height, width, y + 1, x + 2, value - 1) ||
      printPathRecursive(matrix, height, width, y - 1, x + 2, value - 1) ||
      printPathRecursive(matrix, height, width, y + 1, x - 2, value - 1) ||
      printPathRecursive(matrix, height, width, y - 1, x - 2, value - 1);  } 
      
      else if (matrix[y][x] == 0) {
    printf("\n");
    return 1;
        }
    
     else {
    printf("no path.\n");    
    return 0;
  }
}
 
 
int printPath(int **matrix, int height, int width, int y, int x) {
  printf("Path from %d/%d: ", y, x);
  printPathRecursive(matrix, height, width, y, x, matrix[y][x]);
}
 
int main(int argc, char *argv[])
{
    
int readInteger(const char *message) {
  int result;
  
  printf("%s: ", message);
  scanf("%d", &result);
  
  return result;
  
   };
    
    {int height = readInteger("Enter field height");
  int width = readInteger("Enter field width");
  int y = readInteger("Enter start row");;
  int x = readInteger("Enter start column");;
    }
   
  srand(time(0));
 
  int height = 12;
  int width = 12;
  
  int **matrix = newMatrix(height, width, -1);
 
  int y = rand() % height;
  int x = rand() % width;
  fillMatrix(matrix, height, width, y, x, 0);
 
  printMatrix(matrix, height, width);
 
  int i, j;
  for (i = 0; i < height; ++i)
    for (j = 0; j < width; ++j)
      printPath(matrix, height, width, i, j);
 
  deleteMatrix(matrix, height);
  
  printf("Press enter to continue ...");
  getchar();    
  return 0;
}
сказал,что так это не работает.что я делаю не так?

Добавлено через 44 секунды
код вставила Ваш..чтобы инициализировал переменные с помощью scanf.или я даже это неправильно сделала?..
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
25.01.2013, 00:52     Добавить размеры в код "Обход конем" #34
Ыыы... Оно компилируется.

Цитата Сообщение от Катерька Посмотреть сообщение
сказал,что так это не работает.что я делаю не так?
Много всего. Я, пожалуй, не стану даже пытаться объяснить.

Цитата Сообщение от Катерька Посмотреть сообщение
код вставила Ваш..чтобы инициализировал переменные с помощью scanf.или я даже это неправильно сделала?..
Вы вообще проверяете код перед тем, как отсылать? Надо проверять. Собирайте, запускайте. Мало ли, что я вам пришлю. Обфускация и стеганография -- штуки мощные.

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
#include <stdio.h>
 
int **newMatrix(int height, int width, int value) {
  int i, j;
  int **matrix = (int**)malloc(sizeof(int*) * height);
  for (i = 0; i < height; ++i) {
    matrix[i] = (int*)malloc(sizeof(int) * width);
    for (j = 0; j < width; ++j) {
      matrix[i][j] = value;
    }
  }
  return matrix;
}
 
void deleteMatrix(int **matrix, int height) {
  int i;
  for (i = 0; i < height; ++i)
    free(matrix[i]);
  free(matrix);
}
 
void fillMatrix(int **matrix, int height, int width, int y, int x, int value) {
  if (y > -1 && y < height && x > -1 && x < width &&
    (matrix[y][x] > value || matrix[y][x] < 0)) {
    matrix[y][x] = value++;
    fillMatrix(matrix, height, width, y - 1, x - 2, value);
    fillMatrix(matrix, height, width, y + 1, x - 2, value);
    fillMatrix(matrix, height, width, y - 1, x + 2, value);
    fillMatrix(matrix, height, width, y + 1, x + 2, value);
    fillMatrix(matrix, height, width, y - 2, x - 1, value);
    fillMatrix(matrix, height, width, y - 2, x + 1, value);
    fillMatrix(matrix, height, width, y + 2, x - 1, value);
    fillMatrix(matrix, height, width, y + 2, x + 1, value);
  }
}
 
void printMatrix(int **matrix, int height, int width) {
  int i, j;
  for (i = 0; i < height; ++i) {
    for (j = 0; j < width; ++j) {
      printf("%3d", matrix[i][j]);
    }
    printf("\n");
  }
}
 
int printPathRecursive(int **matrix, int height, int width, int y, int x,
  int value) {
  if (x < 0 || x >= width || y < 0 || y >= height || matrix[y][x] != value)
    return 0;
  
  printf("%d/%d ", y, x);
  if (matrix[y][x] > 0) {
    return
      printPathRecursive(matrix, height, width, y - 2, x + 1, value - 1) ||
      printPathRecursive(matrix, height, width, y - 2, x - 1, value - 1) ||
      printPathRecursive(matrix, height, width, y + 2, x + 1, value - 1) ||
      printPathRecursive(matrix, height, width, y + 2, x - 1, value - 1) ||
      printPathRecursive(matrix, height, width, y + 1, x + 2, value - 1) ||
      printPathRecursive(matrix, height, width, y - 1, x + 2, value - 1) ||
      printPathRecursive(matrix, height, width, y + 1, x - 2, value - 1) ||
      printPathRecursive(matrix, height, width, y - 1, x - 2, value - 1);
  } else if (matrix[y][x] == 0) {
    printf("\n");
    return 1;
  } else {
    printf("no path.\n");    
    return 0;
  }
}
 
int printPath(int **matrix, int height, int width, int y, int x) {
  printf("Path from %d/%d: ", y, x);
  printPathRecursive(matrix, height, width, y, x, matrix[y][x]);
}
 
int readInteger(const char *message) {
  int result;
  printf("%s", message);
  scanf("%d", &result);
  return result;
}
 
int main(int argc, char *argv[])
{
  int height = readInteger("Enter height of field: ");
  int width = readInteger("Enter width of field: ");;
  int y = readInteger("Enter starting row: ");;
  int x = readInteger("Enter starting column: ");;
 
  int **matrix = newMatrix(height, width, -1);
 
  fillMatrix(matrix, height, width, y, x, 0);
 
  printMatrix(matrix, height, width);
 
  int i, j;
  for (i = 0; i < height; ++i)
    for (j = 0; j < width; ++j)
      printPath(matrix, height, width, i, j);
 
  deleteMatrix(matrix, height);
  
  printf("Press enter to continue ...");
  getchar();
  getchar();
  return 0;
}
Чисто из любопытства, на кого вы учитесь, что вам дают такие сложные задачи?
MrGluck
Модератор
Эксперт CЭксперт С++
7163 / 4329 / 632
Регистрация: 29.11.2010
Сообщений: 11,751
25.01.2013, 01:04     Добавить размеры в код "Обход конем" #35
Цитата Сообщение от lemegeton Посмотреть сообщение
Чисто из любопытства, на кого вы учитесь, что вам дают такие сложные задачи?
У меня во втором семестре было. Рекурсивный и нерекурсивный алгоритмы обхода доски конем + размеры доски задавались с клавиатуры.
небритый еж
0 / 0 / 0
Регистрация: 24.01.2013
Сообщений: 49
25.01.2013, 01:12     Добавить размеры в код "Обход конем" #36
lemegeton, не поверите,специальность совсем не связана с программированием,но предмет обязательный.мало того,еще в следующем семестре будет С++.Так что готовьтесь,я скоро буду )))
факультет ядерной физики,специальность связана с радиацией.лол,да?казалось бы,к чему оно нужно.
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
25.01.2013, 01:16  [ТС]     Добавить размеры в код "Обход конем" #37
прошу прощения,не вышла из аккаунта,сосед по комнате тоже на форуме этом сидит,свою задачку ищет))общажные дела.
MrGluck
Модератор
Эксперт CЭксперт С++
7163 / 4329 / 632
Регистрация: 29.11.2010
Сообщений: 11,751
25.01.2013, 01:16     Добавить размеры в код "Обход конем" #38
небритый еж, затем же, зачем и программистам ядерная или квантовая физика.
Чтоб было общее развитие и мы были друг с другом на одной волне
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
25.01.2013, 01:22  [ТС]     Добавить размеры в код "Обход конем" #39
MrGluck, это мой пост,я пометила,что с чужого аккаунта просто написала))
ну знаете..с компьютером я разбираюсь отлично,но этого недостаточно видимо.мало того,что был на прошлом курсе паскаль,так еще в этом году всунули С и С++. То есть приеду я куда-нибудь с проверкой замерять загрязненность почвы,а если работы мало окажется,то где-то на дому смогу программку написать требующим..за небольшую плату.так чтоле.Мне физика гораздо интереснее.А программирование я просто уважаю.я с ним на Вы.
MrGluck
Модератор
Эксперт CЭксперт С++
7163 / 4329 / 632
Регистрация: 29.11.2010
Сообщений: 11,751
25.01.2013, 02:00     Добавить размеры в код "Обход конем" #40
Катерька, захотите програмку какую-нибудь написать для подсчета своего маленького коллайдера - запрограммируете, знаний вам хватит как раз ровно для вычисления определенных функций без всей мощи ООП.
У меня в этом семестре были: политология, социология, БЖД, архитектура ЭВМ, обработка визуальной информации и ничего плохого я в этом не вижу. Пока дают знания - надо брать. А "кодить" можно и в шараге научиться.
Процитирую своего социолога, который на первой лекции сказал очень мудрую вещь.
"Давайте решим, для чего вам все это надо. Вы находитесь в высшем учебном заведении. Вас пичкают разной ерундой. Что вы получите при окончании университета. У вас будет как бы условно два нимба над головой. Один, тот, что поменьше, - это ваши знания в области программирования (специальности), второй нимб побольше говорит о том, что вы инженер и сможете свои знания перенести в любую сторону. Т.е. многосторонне развиты и сможете найти свою нишу в области работы."
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
25.01.2013, 02:10  [ТС]     Добавить размеры в код "Обход конем" #41
MrGluck, у нас такого разнообразия нет.наверное,считается,что быть специалистом в своем деле-это -цитируя несравненную нашистку- более лучше,чем знать всего понемногу..и я этим довольна.Просто чувствуется,что хочется большего именно в физике.Хотя у нас и так ее много.Вас,я уверена,после окончания ВУЗа будут ценить именно как программиста,а не инженера с предрасположенностью к программированию.Пусть у меня будет одна область,которую я изучу от и до(а это в ядерной физике не так-то просто) и я буду знать,чего стоят мои усилия.Чем больше я знаю,тем выше требования могу задавать.
Не хочу с Вами спорить,все-таки мне кажется ,это очень сильно зависит от специальности.

Добавлено через 1 минуту
Прошу прощения за кривоватые обороты,учусь за границей,отсутствие языковой практики дает о себе знать.
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
28.01.2013, 16:51  [ТС]     Добавить размеры в код "Обход конем" #42
lemegeton, просмотрите пожалуйста личную почту.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
29.01.2013, 21:23     Добавить размеры в код "Обход конем" #43
Алгоритм рекурсивный.
Заполняем матрицу значениями -1. Количество ходов до начальной точки изначально равно нулю.

Функция заполнения матрицы:
В матрице выбираем переданную точку, если значение в ней -1 или большее, чем переданное количество ходов до начальной точки, записываем туда переданное количество ходов до начальной точки.
Запускаем функцию восемь раз для всех вариантов хода коня, передавая количество ходов до начальной точки + 1.

После выполнения функции получаем матрицу, в которой каждая ячейка содержит количество ходов до начальной точки.

Функция вывода на экран маршрута так же рекурсивна.
Ищется точка, меньшая на единицу чем текущая, выводится на экран, запускается функция для следующей точки. В коде для краткости используется более сложный метод, основанный на том, что булевая дизъюнкция не вычисляется, если первое значение вычисляется в true.

В коде есть вспомогательные функции
createMatrix -- создание матрицы
deleteMatrix -- удаление матрицы
printMatrix -- вывод матрицы на экран.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2013, 19:54     Добавить размеры в код "Обход конем"
Еще ссылки по теме:

Изъять комментарии и добавить вместо них символ "пробел" - C++
В языке паскаль комментарии записываются в фигурных скобках: begin {начало цикла } i:=i+1;{ увеличиваем i на 1} Написать программу на...

Добавить целое число в очередь с помощью "operator <<" - C++
В общем, прочитал я статьи про очереди. Где делается с помощью конструктора,деструктора,массивов. Вот только, у меня одна загвоздка. В...

Добавить в класс "Односвязный список" следующие функции - C++
1. Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в заданную позицию, удаление элемента по заданной позиции,...

Добавить "xxx" перед последним словом строки - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main(void) { char s; char sr; printf(&quot;BBeduTe...

Добавить в конец программы строчку cout << "Your number is", не задев цикл - C++
Здравстуйте! Подскажите, пожалуйста, как добавить в конец программы cout &lt;&lt; &quot;Your number is&quot; не задев цикл. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Катерька
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 32
30.01.2013, 19:54  [ТС]     Добавить размеры в код "Обход конем" #44
lemegeton, спасибо,удаляюсь.всем добра и денег!
Yandex
Объявления
30.01.2013, 19:54     Добавить размеры в код "Обход конем"
Ответ Создать тему
Опции темы

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