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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2011, 19:46   #1
lurtz
Новичок
Джуниор
 
Регистрация: 15.11.2011
Сообщений: 1
Печаль стабильные браки

Пусть нам даны два непересекающихся множества A и B одинакового размера n. Нужно найти множество из n пар (a,b), таких, что a принадлежит A, b принадлежит B и они удовлетворяют некоторым условиям. Для выбора таких пар существует много различных критериев; Один из них называется правилом стабильных браков. Предположим, что A – множество мужчин, а B – женщин. У каждого мужчины и женщины есть различные правила предпочтения возможного партнера. Если среди n выбранных пар существуют мужчины и женщины, не состоящие между собой в браке, но предпочитающие друг друга, а не своих фактических супругов, то такое множество браков считается нестабильным.
Проблема в том, что дин. массив rwm при вызове try() теряет последнюю строчку. куда она девается??
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------



int n;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->StringGrid1->Cells[0][0]="w/r";
Form1->StringGrid2->Cells[0][0]="m/r";
       StringGrid1->Options << goEditing;
       StringGrid2->Options << goEditing;


}

 int w,m,r;
 int **wmr=new int *[n+1];
 int  **mwr=new int *[n+1];
 int  **rmw=new int *[n+1];
 int  **rwm=new int *[n+1];



int * x= new int[n+1];
int *y= new int[n+1];
int *man= new int[n+1];
int *wooman= new int[n+1];
int *rank= new int[n+1] ;
boolean *single = new  boolean[n+1];

boolean stable(int m,int w,int r){
int pm,pw,i,lim;
boolean s=true;

i=1;


while((i<r)&&s)
{
pw=wmr[m][i];i++;
if (!single[pw]) s=(rwm[pw][m]>rwm[pw][y[pw]]);
}
i=1;
lim=rwm[w][m];
        while((i<lim)&&s)//????
        {
        pm=mwr[w][i];i++;
        if((pm<m)){s=(rmw[pm][w]>rmw[pm][x[pm]]); }



        }
return s;


}
 
void Try(int m)

{      
       int w=0;r=0;
     
for(int r=1;r<=n;r++)  {
w=wmr[m][r];

if (single[w])
{
 x[m] = w;
y[w] = m;
 single[w] = false;

if (m< n)Try(m+1);

else{
                  for(int i=1;i<=n;i++)
                  Form1->Memo1->Lines->Add(IntToStr(y[i])+" : "+IntToStr(x[i]));
                
               

};


single[w]= true;


}    
}



}


//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
n=StrToInt(Edit1->Text);
StringGrid1->RowCount=n+1;
StringGrid1->ColCount=n+1;
StringGrid2->RowCount=n+1;
StringGrid2->ColCount=n+1;
for (int i=1;i<=n;i++)
{
         StringGrid1->Cells[0][i]=i;
         StringGrid1->Cells[i][0]=i;
         StringGrid2->Cells[0][i]=i;
         StringGrid2->Cells[i][0]=i;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
  StringGrid1->Cells[j][i]="";

for(int i=1;i<=n;i++)
for(int k=1;k<=n;k++)
{
a:
int j=random(n)+1;
        if(StringGrid1->Cells[j][i]=="")
        {

        StringGrid1->Cells[j][i]=k;
        }else goto a;

}


for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
  StringGrid2->Cells[j][i]="";

for(int i=1;i<=n;i++)
for(int k=1;k<=n;k++)
{
b:
int j=random(n)+1;
        if(StringGrid2->Cells[j][i]=="")
        {

        StringGrid2->Cells[j][i]=k;
        }else goto b;

}

  }

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Lines->Clear();

 for(int q=1;q<=n;q++)
  {
  wmr[q]=new int[n+1];
  mwr[q]=new int[n+1];
  rwm[q]=new int[n+1];
   rmw[q]=new int[n+1];
  }


for(int w=1;w<=n;w++)
{
single[w]=true;
        for(int r=1;r<=n;r++)
        {
         mwr[w][r]=StrToInt(StringGrid2->Cells[r][w]);
         rwm[w][mwr[w][r]]=r;
        

        }


}
  
for(int m=1;m<=n;m++){
        for(int r=1;r<=n;r++)
        {
         wmr[m][r]=StrToInt(StringGrid1->Cells[r][m]);
         rmw[m][wmr[m][r]]=r;
        }
                    }

Try(1);



   


}
//---------------------------------------------------------------------------
lurtz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отступы от левого края в цикле, Как сделать стабильные отступы li в гориз. ul? AlienNation JavaScript, Ajax 4 27.09.2011 16:18
Стабильные размеры формы L.A.M.E.R. Общие вопросы Delphi 3 22.07.2009 10:00