Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Перевод проги из Pascal в C++! (https://forum.antichat.xyz/showthread.php?t=41045)

DesignerMix 28.05.2007 13:28

Перевод проги из Pascal в C++!
 
Задача:

Прямоугольный садовый участок шириной N и длиной M метров разбит на квадраты со стороной 1 метр. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям:
• из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону;
• никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается).
Подсчитайте количество грядок на садовом участке.
Ограничения: 1 <= N, M <= 200, время 1 с.
Ввод из файла beds.in. В первой строке находятся числа N и M через пробел, далее идут N строк по M символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов в исходном файле нет.
Вывод в файл beds.out. Вывести одно число - количество грядок на садовом участке.
Примеры
Ввод 1
5 10
##......#.
.#..#...#.
.###....#.
..##....#.
........#.
Вывод 1
3

Код проги на Pascal:

Код:

{
Written by Fyodor Menshikov 26.01.2004
14:46-14:55
}
{$R+,Q+}
var
  c:array[0..201,0..201]of char;
type
  arr=array[1..40000]of byte;
var
  first,last:word;
  ii,jj:^arr;

  procedure put(i,j:integer);
  begin
      if c[i,j]='#' then begin
        inc(last);
        ii^[last]:=i;
        jj^[last]:=j;
        c[i,j]:='.';
      end;
  end;

  procedure get(var i,j:integer);
  begin
      i:=ii^[first];
      j:=jj^[first];
      inc(first);
  end;

  procedure paint(i,j:integer);
  begin
      first:=1;
      last:=0;
      put(i,j);
      while first<=last do begin
        get(i,j);
        put(i+1,j);
        put(i-1,j);
        put(i,j+1);
        put(i,j-1);
      end;
  end;

var
  n,m,i,j,count:integer;
begin
  new(ii);
  new(jj);
  assign(input,'beds.in');
  reset(input);
  assign(output,'beds.out');
  rewrite(output);
  readln(n,m);
  for i:=0 to n+1 do
      for j:=0 to m+1 do
        c[i,j]:='.';
  for i:=1 to n do begin
      for j:=1 to m do
        read(c[i,j]);
      readln;
  end;
  count:=0;
  for i:=1 to n do
      for j:=1 to m do
        if c[i,j]='#' then begin
            paint(i,j);
            inc(count);
        end;
  writeln(count);
end.

Нужно просто перевести этот код в C++ (плачу 100 рублей), а если переведёте и объясните что зачем, коментами, то 200 рублей. Деньги буду через терминал кидать, так что либо на мобилу, либо на WebMoney.

freddi 28.05.2007 13:30

в линуксе вроде есть проги который переводят из одного языка в другой, правдо криво)

DesignerMix 29.05.2007 11:48

Цитата:

в линуксе вроде есть проги который переводят из одного языка в другой, правдо криво)
Я знаю, даже знаю эту прогу P2c называеться, но она настолько криво переводит, что я не могу разобраться, а как известно ошибки всегда труднее исправлять чем писать с нуля.

А вообще это задание по курсовому, и времени особо нет!! Ну помогите!

Joker-jar 29.05.2007 11:55

Если кто-то взялся, отпишите. Чтоб впустую не делать

Joker-jar 29.05.2007 13:46

Вообще то, что ты дал не работает. Если только так:
Код:

program p1;

type
  arr=array[1..40000] of byte;

var
  n,m,i,j,count:integer;
  c:array[0..201,0..201] of char;
  first,last:word;
  ii,jj:^arr;
  input,output: text;

procedure put(i,j:integer);
  begin
      if c[i,j]='#' then begin
        inc(last);
        ii^[last]:=i;
        jj^[last]:=j;
        c[i,j]:='.';
      end;
  end;

  procedure get(var i,j:integer);
  begin
      i:=ii^[first];
      j:=jj^[first];
      inc(first);
  end;

  procedure paint(i,j:integer);
  begin
      first:=1;
      last:=0;
      put(i,j);
      while first<=last do begin
        get(i,j);
        put(i+1,j);
        put(i-1,j);
        put(i,j+1);
        put(i,j-1);
      end;
  end;

begin
  new(ii);
  new(jj);
  assign(input,'c:\beds.in');
  assign(output,'c:\beds.out');
  reset(input);
  rewrite(output);
  readln(input,n,m);
  for i:=0 to n+1 do
      for j:=0 to m+1 do
        c[i,j]:='.';
  for i:=1 to n do begin
      for j:=1 to m do
        read(input,c[i,j]);
      readln(input);
  end;
  count:=0;
  for i:=1 to n do
      for j:=1 to m do
        if c[i,j]='#' then begin
            paint(i,j);
            inc(count);
        end;
  write(output,count);
  close(input);
  close(output);
end.


VampiRUS 29.05.2007 13:46

лол, у меня такой же курсач был, из одной книги берут)

Ky3bMu4 29.05.2007 14:31

Юзай P2c , выкладывай код. Ошибки исправим.

DesignerMix 29.05.2007 18:44

Цитата:

Вообще то, что ты дал не работает. Если только так:
Когда я компилил, всё работало: в файл выводилось число 3...

Цитата:

лол, у меня такой же курсач был, из одной книги берут)
;)

Цитата:

Юзай P2c , выкладывай код. Ошибки исправим.
Лады!!!

Joker-jar 29.05.2007 23:12

Вот практически рабочий вариант:
Код:

#include <fstream.h>

char c[202][202];

typedef arr, byte[40000];

unsigned short first,last;

int n,m,i,j,coun;

arr *ii, *jj;

void put(int i, int j)
{
  if (c[i][j] == '#')
    {
      last++;
      ii[last] = i;
      jj[last] = j;
      c[i][j] = '.';
    }
}

void get(int *i, int *j)
{
  *i = ii[first];
  *j = jj[first];
  first++;
}

void paint(int i, int j)
{
  first = 1;
  last = 0;
  put(i,j);
  while (first<=last)
    {
      get(&i,&j);
      put(i+1,j);
      put(i-1,j);
      put(i,j+1);
      put(i,j-1);
    }
}

void main()
{
  ii = new arr;
  jj = new arr;
  ifstream input("beds.in");
  ofstream output("beds.out");
  input >> n;
  input >> m;
  for (i = 0; i <= n+1; i++)
    for (j = 0; j <= m+1; j++)
      c[i][j] = '.';
  for (i = 1; i <= n; i++)
    {
      for (j = 1; j <= m; j++)
        input >> c[i][j];
    }
  coun = 0;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (c[i][j] == '#')
        {
          paint(i,j);
          coun++;
        }
/*  delete[] ii;
  delete[] jj;  */
  output << coun;
}

Где-то с указателями бага (ошибка при освобождении), но ответ вроде правильный...

nerezus 30.05.2007 02:03

Код:

# -*- coding: cp1251 -*-
from UserString import MutableString

lines = [
    "1100111110",
    "0011100010",
    "0010000111",
    "0010110010",
    "0010000010",
    "0011111110"
    ]

lines.insert(0, MutableString("0"*len(lines[0])))
lines.append(MutableString("0"*len(lines[0])))

for i in range(len(lines)):
    lines[i] = MutableString("0" + lines[i] + "0")
   
def convert1To2():
    done = False
    while not done:
        done = True
        for i in range(len(lines)):
            for j in range(len(lines[i])):
                if lines[i][j] == '1' and \
                      (lines[i+1][j] == '2' or \
                        lines[i-1][j] == '2' or \
                        lines[i][j+1] == '2' or \
                        lines[i][j-1] == '2'):
                    lines[i][j] = '2'
                    done = False

amount = 0

for i in range(len(lines)):
    for j in range(len(lines[i])):
        if lines[i][j] == '1':
            lines[i][j] = '2'
            amount += 1
            convert1To2()

print "Итого: ", amount

На питоне


Время: 21:13