Переписать код с Turbo Pascal - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите, дуболому =(((
Листинг программы
  1. program Help;
  2. uses crt;
  3. const
  4. SZ = 8; {размерность матрицы}
  5. n=SZ*SZ;
  6. {смещение при ходе коня}
  7. dd:array[1..8,1..2] of integer = ((2,1),(2,-1),(-2,1),(-2,-1),(1,2),
  8. (1,-2),(-1,2),(-1,-2));
  9. type
  10. MATR = array[1..SZ,1..SZ] of integer;
  11. {если в матрице 1, то клетка запрещена}
  12. var
  13. m:MATR;
  14. num,start:integer;
  15. { TRUE, если координата (х,у) корректна}
  16. function Correct(x,y:Integer): boolean;
  17. begin
  18. Correct := (x>=1) and (x<=SZ) and (y>=1) and (y<=SZ);
  19. end;
  20. { проставить в элементы матрицы m, битые конем из (х;у), число 1 }
  21. { возвращает число измененных клеток}
  22. function writem(var m:MATR; x,y:Integer):integer;
  23. var d,x1,y1,count:integer;
  24. begin
  25. count:=0;
  26. for d:=1 to 8 do
  27. begin
  28. x1:=x+dd[d,1];
  29. y1:=y+dd[d,2];
  30. if Correct(x1,y1) then
  31. if m[x1,y1]<>1 then
  32. begin
  33. m[x1,y1]:=1;
  34. Inc(count);
  35. end;
  36. end;
  37. writem:=count;
  38. end;
  39. procedure recur (var m:MATR; n,c,istart,jstart:Integer; var num:integer);
  40. { рекурсивный алгоритм полного перебора
  41. TRUE, если расстановка удалась
  42. m - матрица, n - сколько коней надо еще расставить
  43. c - кол-во нулевых клеток матрицы
  44. istart, jstart - откуда имеет смысл начинать перебор}
  45. function rec(var m:MATR; n,c,istart,jstart:Integer; var num:integer):boolean;
  46. var dc,i,j:Integer;
  47. oldm:MATR;
  48. begin
  49. if (c=0) and (n=0) then
  50. begin
  51. rec:=true; {явно расставить нельзя}
  52. exit;
  53. end;
  54. if (istart>3) then
  55. begin
  56. i:=istart-3;
  57. for j:=1 to SZ do
  58. if m[i,j]=0 then {эта клетка не будет доступна для следующих коней}
  59. begin
  60. rec:=FALSE;
  61. exit;
  62. end;
  63. end;
  64. if ((c-1) div 9 >= n) or (c < n) or (n=0) then
  65. begin
  66. rec:=false; { явно расставить нельзя}
  67. exit;
  68. end;
  69. oldm:=m;
  70. for i:=istart to SZ do
  71. begin
  72. { строку istart начинаем с элемента jstart }
  73. for j:=jstart to SZ do
  74. if m[i,j]=0 then
  75. begin { для всех нулевых клеток делать }
  76. { ставим коня (i,j) }
  77. m[i,j]:=1;
  78. { запоминаем клетки, которые он бьет }
  79. { ставим в эти клетки 1 }
  80. dc:=writem(m,i,j);
  81. { решаем задачу для n-1 коней }
  82. if rec(m,n-1,c-dc-1,i,j,num) then
  83. begin
  84. Write('(',i:2,',',j:2,') '); { решение найдено, тут же выводим его }
  85. rec:=true;
  86. num:=num+1;
  87. exit;
  88. end;
  89. { восстанавливаем матрицу (т.е. клетки, бьющие из (i,j)) }
  90. { убираем оттуда коня }
  91. m:=oldm;
  92. end;
  93. jstart:=1; { следующую строку начинаем сначало }
  94. end;
  95. rec:=false;
  96. end;
  97. begin
  98. repeat
  99. if rec(m,start,SZ*SZ,1,1,num)
  100. then begin
  101. writeln;
  102. writeln ('На доске ',SZ,'*',SZ,' максимально допустимо ',num,' коней');
  103. end;
  104. dec(start)
  105. until start=1;
  106. end;
  107. { очистить матрицу m }
  108. procedure clm(var m:MATR);
  109. var i,j:integer;
  110. begin
  111. for i:=1 to SZ do
  112. for j:=1 to SZ do
  113. m[i,j]:=0;
  114. end;
  115. begin
  116. clrscr;
  117. writeln('Программа вычисляет какое максимальное кол-во коней можно');
  118. writeln('расставить на доске при условии, что они не будут "бить" друг друга');
  119. clm(m);
  120. start:=n;
  121. num:=0;
  122. writeln;
  123. recur (m,start,SZ*SZ,1,1,num);
  124. readln;
  125. end.
Заранее благодарен Добавлено через 2 часа 5 минут 18 секунд HELP!!!! Добавлено через 1 час 37 минут 46 секунд
Листинг программы
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define SZ 8;
  4. #define BoardSquare SZ*SZ
  5.  
  6. void clr (int *m)
  7. {
  8. int i,j;
  9. for (i=0;i<SZ;i++)
  10. for (j=0;j<SZ;j++)
  11. m[i][j]=0;
  12. }
  13.  
  14. int correct (int x,int y)
  15. {
  16. if ((x>=1) && (x<=SZ) && (y>=1) && (y<=SZ))
  17. return 1;
  18. else return 0;
  19. }
  20. int writem ()
  21. {
  22. int d,x1,y1,count;
  23. count=0;
  24. for (d=1; d<8; d++)
  25. {
  26. x1=x+dd[d][1];
  27. y1=y+dd[d][2];
  28. if (correct=1)
  29. if m[x1][y1]<>1
  30. {
  31. m[x1][y1]=1;
  32. count+=1;
  33. }
  34. }
  35. return count;
  36. }
  37.  
  38. void recur ()
  39. {
  40. start=sz;
  41. num=0;
  42. do
  43. {
  44. if rec (m,start,BoardSquare,1,1,num)
  45. printf ("\nНа доске %d*%d максимально допустимо %d",SZ,SZ,num);
  46. start+=1;
  47. }
  48. while (rec=1);
  49. }
  50. int rec()
  51. {
  52. if (c=0) || (BoardSquare=0)
  53. {
  54. return true;
  55. }
  56. if (istart>3)
  57. {
  58. for (i=istart-3,j=0;j<SZ; j++)
  59. if m[i][j]=0
  60. return false;
  61. }
  62. if ((c-1)/9>=BoardSquare) || (c<BoardSquare) || (BoardSquare=0)
  63. {
  64. return false;
  65. }
  66. oldm=m;
  67. for (i=istart; i<SZ; i++)
  68. {
  69. for (j=jstart; j<SZ; j++)
  70. if m[i][j]=0
  71. {
  72. m[i][j]=1;
  73. dc=writem(m,i,j);
  74. if rec (m,BoardSquare-1,c-dc-1,i,j,num)
  75. {
  76. printf ("%d*%d",i,j);
  77. num+=1;
  78. return true;
  79. }
  80. m=oldm;
  81. }
  82. jstart=1;
  83. }
  84. return false;
  85. }
  86. void main (void)
  87. {
  88. const dd[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
  89. int m[8][8];
  90. printf ("\nПрограмма гоняет табуны");
  91. clm(m);
  92. recur (m,BoardSquare,1,1,num);
  93. getchar();
  94. }
По мере своих возможностей набросал, но отладить не могу(

Решение задачи: «Переписать код с Turbo Pascal»

textual
Листинг программы
  1. //---------------------------------------------------------------------------
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define SZ 8
  5. #define BOARDSQUARE (SZ*SZ)
  6. #define TRUE 1
  7. #define FALSE 0
  8.  
  9. //---------------------------------------------------------------------------
  10.  
  11.  
  12. int dd[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,-1},
  13.                 {1,2}, {1,-2}, {-1,2}, {-1,-2}};
  14.  
  15. void Clm(int [][SZ]);
  16. int Correct(int, int);
  17. int Writem(int [][SZ], int [][SZ], int, int);
  18. void Recur(int [][SZ], int, int, int, int, int);
  19. int Rec(int [][SZ], int, int, int, int, int);
  20.  
  21. int main(int argc, char* argv[])
  22. {
  23.    int dd[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,-1},
  24.                 {1,2}, {1,-2}, {-1,2}, {-1,-2}};
  25.    int m[SZ][SZ];
  26.    int num = 0, start = BOARDSQUARE;
  27.  
  28.    printf ("\nÏðîãðГ*ììГ* ГЈГ®Г*ГїГҐГІ ГІГ*ГЎГіГ*Г»");
  29.     Clm(m);
  30.     Recur (m, start, BOARDSQUARE, 1, 1, num);
  31.     getchar();
  32.  
  33.    return 0;
  34. }
  35. //---------------------------------------------------------------------------
  36. void Clm(int m[][SZ])
  37. {
  38.    int i, j;
  39.    for (i = 0; i < SZ; i++)
  40.       for (j = 0; j < SZ; j++)
  41.          m[i][j] = 0;
  42. }
  43.  
  44. int Correct(int x, int y)
  45. {
  46.    if ((x >=1) && (x <= SZ) && (y >= 1) && (y <= SZ))
  47.       return TRUE;
  48.    else
  49.       return FALSE;
  50. }
  51. int Writem(int m[][SZ], int dd[][SZ], int x, int y)
  52. {
  53.    int i, x1, y1 , count = 0;
  54.  
  55.    for (i = 0; i < SZ; i++)
  56.    {
  57.       x1 = x + dd[i][0];
  58.       y1 = y + dd[i][1];
  59.    }
  60.    if (Correct(x1, y1))
  61.       if(m[x1][y1] != 1)
  62.       {
  63.          m[x1][y1] = 1;
  64.          count++;
  65.       }
  66.    return count;
  67. }
  68. void Recur(int m[][SZ], int n, int c, int istart, int jstart, int num)
  69. {
  70.    do
  71.    {
  72.       if (Rec(m, n, c, 1, 1, num))
  73.       {
  74.           printf ("\nГЌГ* äîñêå %d*%d Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® äîïóñòèìî %d",SZ,SZ,num);
  75.           n--;
  76.       }
  77.    }while (n != 1);
  78.    return;
  79. }
  80. int Rec(int m[][SZ], int n, int c, int istart, int jstart, int num)
  81. {
  82.    int dc, i, j;
  83.    int *oldm;
  84.  
  85.    if (c == 0 || BOARDSQUARE == 0)
  86.       return TRUE;
  87.    if (istart > 3)
  88.    {
  89.       i = istart - 3;
  90.       for (j = 0; j <SZ; j++)
  91.       {
  92.          if (m[i][j] == 0)
  93.          {
  94.             return FALSE;
  95.          }
  96.       }
  97.    }
  98.    if (((c - 1) % 9 >= n) || (c < n) || (n == 0))
  99.       return FALSE;
  100.    oldm = m;
  101.    for ( i = istart; i < SZ; i++)
  102.    {
  103.       for (j = jstart; j < SZ; j++)
  104.       {
  105.          if (m[i][j] == 0)
  106.          {
  107.             m[i][j] = 1;
  108.             dc = Writem(m, dd, i, j);
  109.             if (Rec(m, n -1, c - dc - 1, i, j, num))
  110.             {
  111.                printf ("%d*%d",i,j);
  112.                num++;
  113.                return TRUE;
  114.             }
  115.             m = oldm;
  116.          }
  117.       }
  118.       jstart = 1;
  119.    }
  120.    return FALSE;
  121.  
  122. }

Объяснение кода листинга программы

Вот что делает программа:

  1. Задает размеры доски (SZ) и количество шагов (BOARDSQUARE) для игры в шашки.
  2. Создает двумерный массив dd для хранения начальной позиции шашек.
  3. Задает значения для переменных SZ, BOARDSQUARE, TRUE и FALSE.
  4. Создает двумерный массив m для хранения текущей позиции шашек.
  5. Инициализирует функцию Clm для очистки доски.
  6. Инициализирует функцию Correct для проверки допустимости координат.
  7. Инициализирует функцию Writem для записи шашек на доску.
  8. Создает функцию Recur для рекурсивного решения задачи.
  9. Создает функцию Rec для детального решения задачи.
  10. В функции main создает двумерный массив dd и инициализирует его начальной позицией шашек.
  11. Выводит на экран начальную позицию шашек.
  12. Рекурсивно вызывает функцию Recur для перебора всех возможных ходов.
  13. В функции Recur выполняет рекурсивные ходы, пока не будет достигнуто условие окончания игры.
  14. Выводит на экран количество ходов, сделанных компьютером.
  15. В функции Rec рекурсивно решает задачу, пока не будет достигнуто условие окончания игры.
  16. Выводит на экран текущую позицию шашек.
  17. Возвращает управление в функцию main.
  18. Ждет нажатия клавиши для завершения программы. Список переменных:
  19. SZ - размер доски.
  20. BOARDSQUARE - количество шагов.
  21. TRUE и FALSE - булевы значения.
  22. dd - двумерный массив для хранения начальной позиции шашек.
  23. m - двумерный массив для хранения текущей позиции шашек.
  24. num - счетчик ходов.
  25. start - номер первого поля для хода.
  26. i, j - индексы текущего поля.
  27. n - количество ходов.
  28. c - номер текущего цвета.
  29. oldm - указатель на предыдущее значение массива m.
  30. dc - количество шашек, которые были добавлены на доску.
  31. x1, y1 - координаты для проверки.
  32. x, y - координаты текущего хода.
  33. i1, j1 - индексы для рекурсивного вызова функции Rec.
  34. count - счетчик количества шашек, добавленных на доску.
  35. correct - булево значение, указывающее, является ли текущая позиция допустимой.
  36. found - булево значение, указывающее, была ли найдена подходящая позиция для добавления шашки.
  37. pos - переменная для хранения текущей позиции шашек.
  38. message - строка для вывода сообщений на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут