Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 22.04.2009, 00:25   #1
Valerik
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию перевод из Pascal в C++

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

Код программы на Pascal:

Код:
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.

Последний раз редактировалось MaTBeu; 22.04.2009 в 22:08.
Valerik вне форума
Старый 22.04.2009, 13:21   #2
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Задача из суденческой олимпиады в Рыбинске 1998 г.
Блин, если ты решаешь олимпиадную задачу это не значит, что надо писать такое нагромождение... Хоть отступы бы расставил!

Код:
#include<stdio.h>

short int n,m,i,j,count;
char c[202][202];
int *ii , *jj;
unsigned short int first,last;
char buf[5];

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);
   }
}

int main(){
   ii = new int [40010];
   jj = new int [40010];
   freopen("beds.in" , "r" , stdin);
   freopen("beds.out" , "w" , stdout);
   scanf(" %d %d" , &n , &m);
   for(int i = 0; i <= n + 1; i++)
      for(int j = 0; j <= m + 1; j++) 
         c[i][j] = '.';
   gets(buf);
   for(int i = 1; i <= n; i++){
      for(int j = 1; j <= m; j++)
         scanf("%c" , &c[i][j]);
      gets(buf);
   }
   count = 0;
   for(int i = 1; i <= n; i++)
      for(int j = 1; j <= m; j++) 
         if(c[i][j] == '#'){
            paint(i,j);
            count++;
         }
    printf("%d" , count);
    return 0;
}
Некоторые вещи на C++ не перевести, так что кое-что пришлось изменить, но смысл остался тот же.

А зачем было писать "c:\..." вместо просто имени файла?

Последний раз редактировалось megachuhancer; 22.04.2009 в 13:34.
megachuhancer вне форума
Старый 22.04.2009, 13:53   #3
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Код:
   ii = new int [40010];
   jj = new int [40010];
А delete где?

P.S. А вообще, такие числа, забитые в программе, наводят на подозрения о кривости программы.
Pashan вне форума
Старый 22.04.2009, 21:16   #4
Valerik
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию

Спасибо за ответы!!
могу ещё на питоне скинуть,если это поможет..
Pashan:
Подскажи какие числа поставить
Valerik вне форума
Старый 22.04.2009, 21:55   #5
Valerik
 
Регистрация: 21.04.2009
Сообщений: 5
По умолчанию

megachuhancer:
Прости,это не очень понятно:
freopen("beds.in" , "r" , stdin);
freopen("beds.out" , "w" , stdout);
scanf(" %d %d" , &n , &m);
я просто через iostream пыталась сама сделать
не подскажете,как можно изменить?
Valerik вне форума
Старый 22.04.2009, 21:57   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Valerik
freopen("beds.in" , "r" , stdin);
freopen("beds.out" , "w" , stdout);
scanf(" %d %d" , &n , &m);
я просто через iostream пыталась сама сделать
не подскажете,как можно изменить?
Код:
ofstream out("output.txt",ios_base::out);
cout.rdbuf(out.rdbuf());
ifstream in("input.txt",ios_base::in);
cin.rdbuf(in.rdbuf());
cin>>n>>m;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. перевод из десятичной системы счисления в двоичную Xeon332 Помощь студентам 3 24.01.2011 13:54
Перевод кода из Pascal в Object Pascal zemskov77 Общие вопросы Delphi 1 03.01.2009 09:37
Pascal Перевод в Польскую запись ЮнПрог Помощь студентам 3 29.12.2008 13:51
Перевод из Кб в Мб и т.д. okgo Паскаль, Turbo Pascal, PascalABC.NET 8 18.11.2008 21:03