Переписать код с 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- строка для вывода сообщений на экран.