Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
monoxpom
0 / 0 / 0
Регистрация: 23.04.2009
Сообщений: 13
1

Переписать код с Turbo Pascal

05.05.2009, 21:29. Просмотров 698. Ответов 4
Метки нет (Все метки)

Помогите, дуболому =(((

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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 секунд
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#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();
}
По мере своих возможностей набросал, но отладить не могу(
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2009, 21:29
Ответы с готовыми решениями:

Перевести код с turbo pascal
помогите плз в си перевести Var i,j,n,m,imin,imax,max,min,tmp: Integer; p: Longint; x:...

Не могли бы Вы пожалуйста перевести код с Turbo Pascal на Си
Код: uses crt; const nmax=15; var a:array of real; b:array of real; n,i,j:integer; ...

Переписать код с Pascal
Добрый вечер. Прошу помощи по переводу кода программы из паскаля в Си. Спасибо. uses crt; var...

Переписать код с Pascal
надо вот эти программы переделать из паскаля в си. сам в си вообще не шарю, вся надежда на вас!

Переписать код сортировки массива с Pascal
Ребята-программисты друзья пожалуйста помогите человеку сдать лабу до нового года. Переведите этот...

4
kazak
3065 / 2386 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
Завершенные тесты: 1
06.05.2009, 08:23 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//---------------------------------------------------------------------------
#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;
 
}
0
monoxpom
0 / 0 / 0
Регистрация: 23.04.2009
Сообщений: 13
12.05.2009, 17:35  [ТС] 3
Спасибо конечно, но прога до конца не компилируется =( возникает ряд ошибок смысл, которых до конца мне не понятен

Добавлено через 19 часов 36 минут 12 секунд
HEELPPPP!!!!
0
kazak
3065 / 2386 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
Завершенные тесты: 1
13.05.2009, 08:29 4
Я не уверен насчет правильности твоего алгоритма, но вот тебе код, если будут ошибки пиши какие именно(хотя у меня все работает, писал на Borland C++ 6).
0
Вложения
Тип файла: txt listing1.txt (3.0 Кб, 20 просмотров)
monoxpom
0 / 0 / 0
Регистрация: 23.04.2009
Сообщений: 13
17.05.2009, 14:18  [ТС] 5
Странно, на TP все норм было - 32 коня... А тут не может играть важную роль какая-нибудь специфика языка?
0
17.05.2009, 14:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2009, 14:18

Переписать код работы с битами с Pascal
Есть функция на паскале: function code(data: string): string; var i: Word; LastByte: Byte;...

Переписать код с Pascal для нахождения суммы
Здравствуйте. Помогите написать этот код в C Program z; Var x,e,s:real; i,n:integer; Begin...

Перевод из Turbo Pascal В С
program N5; uses crt; var a: array of integer; i,n,x1,x2,k: integer; begin clrscr; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru