Переписать код с 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
- строка для вывода сообщений на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д