Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней. Закрыто  Сообщений: 3 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 25.12.2008
Может кто-нибудь может помочь? очень сильно надо, чем быстрее, тем лучше)

#77

Желательней на Паскале



Партнер
 

Member
Статус: Не в сети
Регистрация: 10.12.2003
Хе. Помню в детстве нарешался я таких задачек )) Но все равно люблю их, и именно такое программирование мне до сих пор больше всего нравится. Всмысле именно разработка алгоритмов, а не работа со всякими там готовыми компонентами, разработка GUI и тому подобная скукотища )

По делу: обычная "закраска". Решил тряхнуть стариной, результат ниже (на C++)
Код:
#include<iostream>
#include<fstream>
using namespace std;

int wall[4][16]={0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,
      0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,
      0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
      0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
int addX[4]={0,1,0,-1},addY[4]={-1,0,1,0};
int roomsAmount=0,xMax,yMax,roomSize;
int **dirMatr,**fillMatr;
int *queueX,*queueY;

void fReadInput();
void fFillRooms();
void fWriteOutput();

void main(void){
   fReadInput();
   fFillRooms();
   fWriteOutput();
   for(int y=0;y<=yMax;y++) {delete dirMatr[y]; delete fillMatr[y];} delete[] dirMatr; delete[] fillMatr; delete[] queueX; delete[] queueY;}

void fFillRooms(void){
   int x,y,k,newX,newY,queueSize,curPos; fstream temp;
   temp.open("temp.txt",ios::out);
   for(y=1;y<=yMax;y++) for(x=1;x<=xMax;x++) if(fillMatr[y][x]==0){
      queueSize=curPos=1; queueY[1]=y; queueX[1]=x; fillMatr[y][x]=1; roomSize=1;
      while(curPos<=queueSize){
         for(k=0;k<4;k++){
            newX=queueX[curPos]+addX[k]; newY=queueY[curPos]+addY[k];
            if(newY>0 && newY<=yMax && newX>0 && newX<=xMax && wall[k][dirMatr[queueY[curPos]][queueX[curPos]]]==0 && fillMatr[newY][newX]==0){
               fillMatr[newY][newX]=1; roomSize++;
               queueSize++; queueY[queueSize]=newY; queueX[queueSize]=newX;}}
         curPos++;}
      roomsAmount++;
      temp<<roomSize<<' ';}
   temp.close();}

void fWriteOutput(void){
   fstream out,temp; int i,t;
   out.open("output.txt",ios::out);
   out<<roomsAmount<<'\n';
   temp.open("temp.txt",ios::in);
   for(i=1;i<=roomsAmount;i++) {temp>>t; out<<t<<' ';}
   temp.close();
   out.close();}

void fReadInput(void){
   fstream in; int y,x;
   in.open("input.txt",ios::in);
   in>>yMax>>xMax;
   dirMatr = new int* [yMax+1]; for(y=0;y<=yMax;y++) dirMatr[y]=new int [xMax+1];
   fillMatr = new int* [yMax+1]; for(x=0;x<=yMax;x++) fillMatr[x]=new int [xMax+1];
   queueX = new int [yMax*xMax+1]; queueY = new int [yMax*xMax+1];
   for(y=1;y<=yMax;y++) for(x=1;x<=xMax;x++) {in>>dirMatr[y][x]; fillMatr[y][x]=0;}
   in.close();}

Немного корявенько т.к. набросал по-быстрому, но суть должна быть понятна. Тебе в принципе нужна только функция fFillRooms, алгоритм там простой - ищем незакрашенную клетку, и качинаем от нее закрашивать. Короче "закраска", что тут еще говорить. Размеры комнат вывожу во временный файл, т.к. неохота связываться с векторами (кол-во комнат ведь заранее неизвестно). Ну или можно сразу выводить в итоговый файл, а потом в начало файла добавить кол-во комнат, но я с файлами в C++ не очень хорошо работаю...

PS: Паскаль незнаю.


 

Junior
Статус: Не в сети
Регистрация: 25.12.2008
theone
спасибо! большое...
может кто-нибудь ещё в паскаль перепишет?

В ветке "Домашние, курсовые" или в ЛС. vor


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней. Закрыто  Сообщений: 3 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan