C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

特定のケースのマッチング問題を解決するためのC++プログラム


これは、特定のケースのマッチング問題を解決するためのC++プログラムです。ここでは、男性N人と女性N人が与えられ、それぞれの人が異性のすべてのメンバーを優先順にランク付けし、男性と女性を結婚させて、両方がお互いを持っていることを望んでいる異性の2人がいないようにします。現在のパートナー。そのような人がいなければ、すべての結婚は「安定」しています。

アルゴリズム

Begin
   function WomenPrefersMenOverMen1():
   A) Check if women prefer men over her current engagement men1
   B) If men1 comes before men in list of women, then women prefer her current engagement.
   C) If men comes before men1 in womens's list, then free her current engagement and engage her with men.
End
Begin
   function stablewedding():
   1) Boys are numbered as 0 to N-1.
   2) Girls are numbered as N to 2N-1.
   3) While men are free
      A) Pick the first free man
      B) One by one go to all women according to pick free man’s preferences.
      C) The woman of preference is free, woman and man become partners.
      D) If woman is not free Find current engagement of woman
      E) If woman prefers man over her current engagement man1, then break the engagement between woman and man1 and engage man with woman.
End

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define N 4
bool WomenPrefersMenOverMen1(int prefer[2*N][N], int w, int m, int m1) {
   for (int i = 0; i < N; i++) {
      if (prefer[w][i] == m1)
         return true;
      if (prefer[w][i] == m)
         return false;
   }
}
void stablewedding(int prefer[2*N][N]) {
   int wPartner[N]; //Initialize an array to store partner of women.
   bool mFree[N]; //Initialize an array to store availability of men.
   //Initialize all men and women as free.
   memset(wPartner, -1, sizeof(wPartner));
   memset(mFree, false, sizeof(mFree));
   int freeCnt = N;
   while (freeCnt > 0) { //While men is free
      int m; //Pick the first free man
      //One by one go to all women according to pick free man’s preferences.
      for (m = 0; m < N; m++)
         if (mFree[m] == false)
            break;
      for (int i = 0; i < N && mFree[m] == false; i++) {
         int w = prefer[m][i];
         //The woman of preference is free, woman and man become partners.
         if (wPartner[w-N] == -1) {
            wPartner[w-N] = m;
            mFree[m] = true;
            freeCnt--;
         } else { //If w is not free
             //Find current engagement of woman
            int m1 = wPartner[w-N];
            // If woman prefers man over her current engagement man1, 
            // then break the engagement between woman and man1 and engage man with woman.
            if (WomenPrefersMenOverMen1(prefer, w, m, m1) == false) {
               wPartner[w-N] = m;
               mFree[m] = true;
               mFree[m1] = false;
            }
         }      
      }
   }
   cout << "Woman Man" << endl;
   for (int i = 0; i < N; i++)
      cout << " " << i+N << "\t" << wPartner[i] << endl;
}
int main() {
   int p[2*N][N] = { 
      {7, 5, 6, 4},
      {5, 4, 7, 6},
      {4, 5, 7, 6},
      {4, 5, 7, 6},
      {0, 1, 3, 2},
      {0, 1, 3, 2},
      {0, 1, 3, 2},
      {0, 1, 3, 2},
   };
   stablewedding(p);
   return 0;
}

出力

Woman Man
4 3
5 1
6 2
7 0

  1. 配列要素の乗算のためのC++プログラム

    整数要素の配列で与えられ、タスクは配列の要素を乗算して表示することです。 例 Input-: arr[]={1,2,3,4,5,6,7} Output-: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 Input-: arr[]={3, 4,6, 2, 7, 8, 4} Output-: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 以下のプログラムで使用されるアプローチは次のとおりです − 一時変数を初期化して、最終結果を1で格納します ループを0からnまで開始します。nは配列のサイズです 最終結果を得るには、tempの値にarr[i]を掛け続

  2. C++での8進数から10進数への変換のプログラム

    入力として8進数を指定すると、タスクは指定された8進数を10進数に変換することです。 コンピューターの10進数は10進数で表され、8進数は0から7までの8進数で表されますが、10進数は0から9までの任意の数字にすることができます。 8進数を10進数に変換するには、次の手順に従います- 余りから右から左に数字を抽出し、それを0から始まる累乗で乗算し、(桁数)–1まで1ずつ増やします。 8進数から2進数に変換する必要があるため、8進数の基数は8であるため、累乗の基数は8になります。 指定された入力の桁にベースとパワーを掛けて、結果を保存します 乗算されたすべての値を加算して、10進数になる