Переписать код с Turbo Pascal - C (СИ)
Формулировка задачи:
Помогите, дуболому =(((
Заранее благодарен
Добавлено через 2 часа 5 минут 18 секунд
HELP!!!!
Добавлено через 1 час 37 минут 46 секунд
По мере своих возможностей набросал, но отладить не могу(
Листинг программы
- 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.
Листинг программы
- #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;
- }
Объяснение кода листинга программы
Вот что делает программа:
- Задает размеры доски (SZ) и количество шагов (BOARDSQUARE) для игры в шашки.
- Создает двумерный массив
dd
для хранения начальной позиции шашек. - Задает значения для переменных
SZ
,BOARDSQUARE
,TRUE
иFALSE
. - Создает двумерный массив
m
для хранения текущей позиции шашек. - Инициализирует функцию
Clm
для очистки доски. - Инициализирует функцию
Correct
для проверки допустимости координат. - Инициализирует функцию
Writem
для записи шашек на доску. - Создает функцию
Recur
для рекурсивного решения задачи. - Создает функцию
Rec
для детального решения задачи. - В функции
main
создает двумерный массивdd
и инициализирует его начальной позицией шашек. - Выводит на экран начальную позицию шашек.
- Рекурсивно вызывает функцию
Recur
для перебора всех возможных ходов. - В функции
Recur
выполняет рекурсивные ходы, пока не будет достигнуто условие окончания игры. - Выводит на экран количество ходов, сделанных компьютером.
- В функции
Rec
рекурсивно решает задачу, пока не будет достигнуто условие окончания игры. - Выводит на экран текущую позицию шашек.
- Возвращает управление в функцию
main
. - Ждет нажатия клавиши для завершения программы. Список переменных:
SZ
- размер доски.BOARDSQUARE
- количество шагов.TRUE
иFALSE
- булевы значения.dd
- двумерный массив для хранения начальной позиции шашек.m
- двумерный массив для хранения текущей позиции шашек.num
- счетчик ходов.start
- номер первого поля для хода.i
,j
- индексы текущего поля.n
- количество ходов.c
- номер текущего цвета.oldm
- указатель на предыдущее значение массиваm
.dc
- количество шашек, которые были добавлены на доску.x1
,y1
- координаты для проверки.x
,y
- координаты текущего хода.i1
,j1
- индексы для рекурсивного вызова функцииRec
.count
- счетчик количества шашек, добавленных на доску.correct
- булево значение, указывающее, является ли текущая позиция допустимой.found
- булево значение, указывающее, была ли найдена подходящая позиция для добавления шашки.pos
- переменная для хранения текущей позиции шашек.message
- строка для вывода сообщений на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д