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

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

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

Помогите, дуболому =(((
program Help;
uses crt;
const
  SZ = 8; {размерность матрицы}
  n=SZ*SZ;
    {смещение при ходе коня}
  dd:array[1..8,1..2] of integer = ((2,1),(2,-1),(-2,1),(-2,-1),(1,2),
   (1,-2),(-1,2),(-1,-2));
type
  MATR = array[1..SZ,1..SZ] of integer;
   {если в матрице 1, то клетка запрещена}
var
  m:MATR;
  num,start:integer;
{ TRUE, если координата (х,у) корректна}
function Correct(x,y:Integer): boolean;
begin
  Correct := (x>=1) and (x<=SZ) and (y>=1) and (y<=SZ);
end;
 
{ проставить в элементы матрицы m, битые конем из (х;у), число 1 }
{ возвращает число измененных клеток}
function writem(var m:MATR; x,y:Integer):integer;
var d,x1,y1,count:integer;
begin
  count:=0;
  for d:=1 to 8 do
  begin
    x1:=x+dd[d,1];
    y1:=y+dd[d,2];
    if Correct(x1,y1) then
      if m[x1,y1]<>1 then
      begin
        m[x1,y1]:=1;
        Inc(count);
      end;
  end;
  writem:=count;
end;
 
procedure recur (var m:MATR; n,c,istart,jstart:Integer; var num:integer);
{ рекурсивный алгоритм полного перебора
 TRUE, если расстановка удалась
 m - матрица, n - сколько коней надо еще расставить
 c - кол-во нулевых клеток матрицы
 istart, jstart - откуда имеет смысл начинать перебор}
 
function rec(var m:MATR; n,c,istart,jstart:Integer; var num:integer):boolean;
var dc,i,j:Integer;
    oldm:MATR;
    begin
  if (c=0) and (n=0) then
  begin
    rec:=true;   {явно расставить нельзя}
    exit;
  end;
  if (istart>3) then
  begin
    i:=istart-3;
    for j:=1 to SZ do
      if m[i,j]=0 then {эта клетка не будет доступна для следующих коней}
      begin
        rec:=FALSE;
        exit;
      end;
  end;
  if ((c-1) div 9 >= n) or (c < n) or (n=0) then
  begin
    rec:=false; {  явно расставить нельзя}
    exit;
  end;
  oldm:=m;
  for i:=istart to SZ do
  begin
     { строку istart начинаем с элемента jstart }
    for j:=jstart to SZ do
      if m[i,j]=0 then
      begin { для всех нулевых клеток делать }
         { ставим коня  (i,j) }
        m[i,j]:=1;
         { запоминаем клетки, которые он бьет }
         { ставим в эти клетки 1 }
        dc:=writem(m,i,j);
         { решаем задачу для n-1 коней }
        if rec(m,n-1,c-dc-1,i,j,num) then
        begin
          Write('(',i:2,',',j:2,') '); { решение найдено, тут же выводим его }
          rec:=true;
          num:=num+1;
          exit;
        end;
         { восстанавливаем матрицу (т.е. клетки, бьющие из (i,j)) }
         { убираем оттуда коня }
        m:=oldm;
      end;
    jstart:=1; { следующую строку начинаем сначало }
  end;
   rec:=false;
end;
 
begin
repeat
    if rec(m,start,SZ*SZ,1,1,num)
       then begin
       writeln;
       writeln ('На доске ',SZ,'*',SZ,' максимально допустимо ',num,' коней');
       end;
       dec(start)
  until start=1;
end;
 
{ очистить матрицу m }
procedure clm(var m:MATR);
var i,j:integer;
begin
  for i:=1 to SZ do
    for j:=1 to SZ do
      m[i,j]:=0;
end;
 
begin
  clrscr;
  writeln('Программа вычисляет какое максимальное кол-во коней можно');
  writeln('расставить на доске при условии, что они не будут "бить" друг друга');
  clm(m);
  start:=n;
  num:=0;
  writeln;
  recur (m,start,SZ*SZ,1,1,num);
  readln;
end.
Заранее благодарен Добавлено через 2 часа 5 минут 18 секунд HELP!!!! Добавлено через 1 час 37 минут 46 секунд
#include<stdio.h>
#include<stdlib.h>
#define SZ 8;
#define BoardSquare SZ*SZ

void  clr (int *m)
{
 int i,j;
 for (i=0;i<SZ;i++)
   for (j=0;j<SZ;j++)
       m[i][j]=0;
}

int correct (int x,int y)
 {
  if ((x>=1) && (x<=SZ) && (y>=1) && (y<=SZ))
      return 1;
  else return 0;
 }
 
int writem ()
{
int d,x1,y1,count;
count=0;
for (d=1; d<8; d++)
 {
  x1=x+dd[d][1];
  y1=y+dd[d][2];
  if (correct=1)
    if m[x1][y1]<>1
      {
       m[x1][y1]=1;
       count+=1;
      }
 }
 return count;
}

void recur ()
{
  start=sz;
  num=0;
  do
  {
    if rec (m,start,BoardSquare,1,1,num)
    printf ("\nНа доске %d*%d максимально допустимо %d",SZ,SZ,num);
    start+=1;
  }
  while (rec=1);
}
int rec()
  {
   if (c=0) || (BoardSquare=0)
      {
    return true;
      }
   if (istart>3)
      {
    for (i=istart-3,j=0;j<SZ; j++)
       if m[i][j]=0
          return false;
      }
    if ((c-1)/9>=BoardSquare) || (c<BoardSquare) || (BoardSquare=0)
      {
    return false;
      }
    oldm=m;
    for (i=istart; i<SZ; i++)
     {
       for (j=jstart; j<SZ; j++)
      if m[i][j]=0
        {
         m[i][j]=1;
         dc=writem(m,i,j);
         if rec (m,BoardSquare-1,c-dc-1,i,j,num)
           {
        printf ("%d*%d",i,j);
        num+=1;
        return true;
           }
        m=oldm;
        }
 
    jstart=1;
     }
     return false;
  }
 
void main (void)
{
 const dd[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
int m[8][8];
 
 printf ("\nПрограмма гоняет табуны");
 clm(m);
 recur (m,BoardSquare,1,1,num);
 getchar();
}
По мере своих возможностей набросал, но отладить не могу(

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

textual
Листинг программы
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#define SZ 8
#define BOARDSQUARE (SZ*SZ)
#define TRUE 1
#define FALSE 0
 
//---------------------------------------------------------------------------
 
 
int dd[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,-1},
                {1,2}, {1,-2}, {-1,2}, {-1,-2}};
 
void Clm(int [][SZ]);
int Correct(int, int);
int Writem(int [][SZ], int [][SZ], int, int);
void Recur(int [][SZ], int, int, int, int, int);
int Rec(int [][SZ], int, int, int, int, int);
 
int main(int argc, char* argv[])
{
   int dd[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,-1},
                {1,2}, {1,-2}, {-1,2}, {-1,-2}};
   int m[SZ][SZ];
   int num = 0, start = BOARDSQUARE;
 
   printf ("\nÏðîãðГ*ììГ* ГЈГ®Г*ГїГҐГІ ГІГ*ГЎГіГ*Г»");
    Clm(m);
    Recur (m, start, BOARDSQUARE, 1, 1, num);
    getchar();
 
   return 0;
}
//---------------------------------------------------------------------------
void Clm(int m[][SZ])
{
   int i, j;
   for (i = 0; i < SZ; i++)
      for (j = 0; j < SZ; j++)
         m[i][j] = 0;
}
 
int Correct(int x, int y)
{
   if ((x >=1) && (x <= SZ) && (y >= 1) && (y <= SZ))
      return TRUE;
   else
      return FALSE;
}
int Writem(int m[][SZ], int dd[][SZ], int x, int y)
{
   int i, x1, y1 , count = 0;
 
   for (i = 0; i < SZ; i++)
   {
      x1 = x + dd[i][0];
      y1 = y + dd[i][1];
   }
   if (Correct(x1, y1))
      if(m[x1][y1] != 1)
      {
         m[x1][y1] = 1;
         count++;
      }
   return count;
}
void Recur(int m[][SZ], int n, int c, int istart, int jstart, int num)
{
   do
   {
      if (Rec(m, n, c, 1, 1, num))
      {
          printf ("\nГЌГ* äîñêå %d*%d Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г® äîïóñòèìî %d",SZ,SZ,num);
          n--;
      }
   }while (n != 1);
   return;
}
int Rec(int m[][SZ], int n, int c, int istart, int jstart, int num)
{
   int dc, i, j;
   int *oldm;
 
   if (c == 0 || BOARDSQUARE == 0)
      return TRUE;
   if (istart > 3)
   {
      i = istart - 3;
      for (j = 0; j <SZ; j++)
      {
         if (m[i][j] == 0)
         {
            return FALSE;
         }
      }
   }
   if (((c - 1) % 9 >= n) || (c < n) || (n == 0))
      return FALSE;
   oldm = m;
   for ( i = istart; i < SZ; i++)
   {
      for (j = jstart; j < SZ; j++)
      {
         if (m[i][j] == 0)
         {
            m[i][j] = 1;
            dc = Writem(m, dd, i, j);
            if (Rec(m, n -1, c - dc - 1, i, j, num))
            {
               printf ("%d*%d",i,j);
               num++;
               return TRUE;
            }
            m = oldm;
         }
      }
      jstart = 1;
   }
   return FALSE;
 
}

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

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

  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