+1 (315) 557-6473 

C++ Program to Implement 2D Array Assignment Solution.


Instructions

Objective
Write a c++ program to implement 2D array in c++.

Requirements and Specifications

A. Write a C++ assignment program that prompts the user to enter the size of the rows and columns (between 2 and 10) for a matrix (2D array). The program will randomly fill the numbers 0 and 1 into the matrix, print the matrix, and output the minimum number of rectangles/squares that can cover all the 1 values in the matrix to the screen. The size of a rectangle/square is defined by the number of 1's in it. There may be two or more largest rectangles/squares of the same size, and values may "wrap around" or overlap to determine the size. Here are the rules in forming groups of ones:
  • Consider the consecutive 'ones' in the matrix and group them (green boxes).
  • Each group should contain the largest number of 'ones' and no blank cells.
  • The number of 'ones' in a group must be a power of 2 i.e. a group can contain:
  • Grouping is carried-on in decreasing order meaning, one must try to group for 8 (octet) first, then for 4 (quad), followed by 2 and lastly for 1 (isolated 'ones').
  • Grouping is done either horizontally or vertically or in terms of rectangles/squares. Diagonal grouping of 'ones' is not permitted.
  • The same element(s) may repeat in multiple groups only if this increases the size of the group.
  • The elements around the edges of the matrix, including the four corners, are adjacent and can be grouped together.

Source Code

 PROBLEM A

#include

#include "Board.h"

using namespace std;

int getMaxHeight(int *M, int r, int c, int i, int j, int w)

{

 int j2 = -1;

 int i2;

 if (*(M + j * r + i) != 0) {

  for (j2 = j; j2 < c && *(M + j2 * r + i) != 0; j2++)

  {

   for (i2 = i; i2 - i < w; i2++)

   {

    if (*(M + r * j2 + i2) == 0)

     return j2 - j;

   }

  }

 }

 return j2 - j;

}

void findLargestRectangle(int *M, int r, int c, int i, int j, int *ei, int *ej)

{

 int max_width = 0;

 int max_height = 0;

 int max_area_covered = 0;

 *ei = *ej = -1;

 for (max_width = 0; max_width < r - i && (*(M + j * r + (i + max_width)) != 0); max_width++)

 {

  int area_covered;

  int height_i = getMaxHeight(M, r, c, i, j, max_width + 1);

  if (height_i > max_height)

  {

   max_height = height_i;

  }

  area_covered = height_i * (max_width + 1);

  if (area_covered > max_area_covered)

  {

   max_area_covered = area_covered;

   *ei = i + max_width;

   *ej = j + height_i - 1;

  }

 }

}

void printMatrix(int* M, int r, int c)

{

 cout << "Generated grid:" << endl << endl;

 for (int i = 0; i < r; i++)

 {

  for (int j = 0; j < c; j++)

  {

   cout << *(M + r * i + j) << " ";

  }

  cout << endl;

 }

}

int main()

{

 int j2;

 int i2;

 int i = 0;

 int j = 0;

 int total_rects = 0;

 // Ask for number of rows and columns

 int r, c;

 cout << "Enter number of rows (2-10): ";

 cin >> r;

 // check that value is between 2 and 10

 if (r < 2 || r > 10)

 {

  cout << "Number of rows must be between 2 and 10" << endl;

  exit(1);

 }

 cout << "Enter number of columns (2-10): ";

 cin >> c;

 // check that value is between 2 and 10

 if (c < 2 || c > 10)

 {

  cout << "Number of columns must be between 2 and 10" << endl;

  exit(1);

 }

 // Create a matrix and fill it

 int *M = (int*)malloc((r*c) * sizeof(int));

 for (int i = 0; i < r; i++)

 {

  for (int j = 0; j < c; j++)

  {

   *(M + r * i + j) = (int)(rand() % 2); // random between 0 and 1

  }

 }

 cout << endl;

 printMatrix(M, r, c);

 cout << endl;

 for (j = 0; j < c; j++) {

  for (i = 0; i < r; i++)

  {

   if (*(M + j * c + i) == 1) // the value is 1

   {

    findLargestRectangle(M, r, c, i, j, &i2, &j2);

    int start_i;

    int start_j;

    total_rects++;

    for (start_j = j; start_j <= j2; start_j++)

    {

     for (start_i = i; start_i <= i2; start_i++)

     {

      *(M + start_j * c + start_i) = 2;

     }

    }

    //printMatrix(M, r, c);

   }

  }

 }

 cout << "The minimum number of rectnagles/squares formed is " << total_rects << endl; // print

 return 0;

}

PROBLEM B

#include

#include

#include

#include

#include

using namespace std;

int main()

{

    // read file

 string file_name;

 cout << "Enter the file name: ";

 getline(cin, file_name);

 ifstream file(file_name);

 string line;

 int i = 0;

 getline(file, line);

 int n = stoi(line);

 string departure_city, destination_city;

 int departure_day, departure_month, departure_hour, departure_min;

 int departure_tz_hr, departure_tz_min;

 int destination_day, destination_month, destination_hour, destination_min;

 int destination_tz_hr, destination_tz_min;

 int departure_tz, destination_tz;

 int travel_time_hr, travel_time_min;

 int travel_time;

 int departure_time;

 for (int i = 0; i < n; i++)

 {

  int fid = 0;

  for (int j = 0; j < 6; j++)

  {

   getline(file, line);

   if (fid == 0) // departure city

   {

    departure_city = line;

   }

   else if (fid == 1) // departure time

   {

    departure_month = stoi(line.substr(0, 2));

    departure_day = stoi(line.substr(3, 5));

    departure_hour = stoi(line.substr(6, 8));

    departure_min = stoi(line.substr(9, 11));

    if (line.substr(9,11).at(0) == '0')

     departure_time = departure_hour * 100 + departure_min;

    else

     departure_time = departure_hour * 100 + departure_min;

    //departure_time = departure_hour * 100 + departure_min * 10;

   }

   else if (fid == 2) // departure time zone

   {

    char sign = line.at(0);

    int idx = line.find(':');

    departure_tz_hr = stoi(line.substr(1, idx));

    departure_tz_min = stoi(line.substr(idx + 1, line.length()));

    if (line.substr(idx + 1).length() == 2)

     departure_tz = departure_tz_hr * 100 + departure_tz_min;

    else

     departure_tz = departure_tz_hr * 100 + departure_tz_min * 10;

    if (sign == '-')

     departure_tz = -departure_tz;

   }

   else if (fid == 3)

    destination_city = line;

   else if (fid == 4)

   {

    char sign = line.at(0);

    int idx = line.find(':');

    destination_tz_hr = stoi(line.substr(1, idx));

    destination_tz_min = stoi(line.substr(idx + 1));

    if(line.substr(idx + 1).length() == 2)

     destination_tz = destination_tz_hr * 100 + destination_tz_min;

    else

     destination_tz = destination_tz_hr * 100 + destination_tz_min*10;

    if (sign == '-')

     destination_tz = -destination_tz;

   }

   else if (fid == 5)

   {

    char sign = line.at(0);

    int idx = line.find(':');

    travel_time_hr = stoi(line.substr(0, idx));

    travel_time_min = stoi(line.substr(idx + 1, line.length()));

    if (line.substr(idx + 1).length() == 2)

     travel_time = travel_time_hr * 100 + travel_time_min;

    else

     travel_time = travel_time_hr * 100 + travel_time_min*10;

   }

   fid++;

  }

  // Print info read

  /*

  cout << "Departure: " << departure_city << endl;

  cout << "Departure Time: " << departure_month << " " << departure_day << " " << departure_time << endl;

  cout << "Departure Timezone: " << departure_tz << endl;

  cout << "Destination: " << destination_city << endl;

  cout << "Destination Timezone: " << destination_tz << endl;

  cout << "Travel Time: " << travel_time << endl << endl;

  */

  cout << endl;

  cout << "Data Set " << (i + 1) << ":" << endl;

  cout << "Departs " << departure_city << " ";

  if(departure_month < 10)

   cout << "0" << departure_month << " " << departure_day << " ";

  else

   cout << departure_month << " " << departure_day << " ";

  if (departure_hour < 10)

   cout << "0" << departure_hour << ":";

  else

   cout << departure_hour << ":";

  if (departure_min < 10)

   cout << "0" << departure_min << endl;

  else

   cout << departure_hour << endl;

  // Now calculate

  // take departure time and convert to UTC+00

  int departure_UTC = departure_time - departure_tz;

  // calculate arrival time

  int arrival_UTC = departure_UTC + travel_time;

  // now convert to the destination timezone

  int arrival_time = arrival_UTC + destination_tz;

  int days = 0;

  while (arrival_time > 2359)

  {

   arrival_time -= 2400;

   days++;

  }

  int arrival_hour = arrival_time / 100;

  int arrival_min = arrival_time - arrival_hour * 100;

  while (arrival_min > 59)

  {

   arrival_min -= 60;

   arrival_hour += 1;

  }

  cout << "Arrives " << destination_city << " ";

  if (arrival_hour < 10)

   cout << "0" << arrival_hour << ":";

  else

   cout << arrival_hour << ":";

  if (arrival_min< 10)

   cout << "0" << arrival_min << " ";

  else

   cout << arrival_min << " ";

  if (days == 1)

   cout << "following day" << endl;

  else if (days == 0)

   cout << "same day" << endl;

  else

   cout << days << " days after" << endl;

 }

 file.close();

}

PROBLEM C

#include

#include "Deck.h"

#include "Hand.h"

#include

using namespace std;

int main()

{

 srand(time(NULL));

 Deck deck; // creates deck

 deck.shuffle();

 Card card = deck.pop();

 cout << card << endl;

 // start game

 bool playing = true;

 bool playingRound = false;

 int roundType = 0;

 double money = 1000; // initial money

 string playerName; // store player name here

 char input;

 double bet;

 cout << "Enter player name: ";

 getline(cin, playerName);

 while (playing)

 {

  if (roundType == 0)

  {

   // ask if player wants to play demo or game

   cout << "Do you wish to play in (e)-Demo or (g)-Game mode? ";

   cin >> input;

   if (input == 'g' || input == 'G') // game mode

   {

    // display amount

    roundType = 1;

    playingRound = true;

   }

  }

  else if (roundType == 1) // game mode

  {

   // display amount

   cout << playerName << ", you have $" << money << " dollars." << endl;

   cout << "How much you want to bet? ";

   cin >> bet;

   cout << endl;

   if (bet >= 10 && bet <= money && bet <= 1000)

   {

    playingRound = true;

    // create player hand and dealers hand

    Hand dealer;

    // Add one card face down

    Card c = deck.pop();

    dealer.add(c);

    // add one card face up

    c = deck.pop();

    c.showFace();

    dealer.add(c);

    // take 3 cards from deck and add them to players hand

    Hand player;

    for (int i = 0; i < 2; i++)

    {

     c = deck.pop();

     c.showFace();

     player.add(c);

    }

    // Now, start round

    while (playingRound)

    {

     cout << "Dealer's cards: " << dealer << endl << endl;

     cout << "Your cards: " << player << endl;

     // ask for next step

     cout << "(H)-Hit, (S)-Stand (Q)-Quit: ";

     cin >> input;

     dealer.showAll();

     if (input == 'h' || input == 'H') // hit

     {

      // deal a new card to player

      c = deck.pop();

      c.showFace();

      player.add(c);

      if (player.getValue() == 21) // player got 21

      {

       cout << "Your cards: " << player << endl << endl;

       cout << "Dealer's cards: " << dealer << endl << endl;

       while (dealer.getValue() < 17)

       {

        Card c = deck.pop();

        c.showFace();

        dealer.add(c);

        cout << "Dealer drew: [" << dealer.getValue() << "] " << c << endl;

       }

       if (dealer.getValue() == 21) // it's a tie

       {

        cout << "It's a tie!" << endl;

       }

       else if (dealer.getValue() < 21 || dealer.getValue() > 21) // player wins

       {

        cout << "You won!";

        double k = 1.0;

        if (player.getHandCount() == 2) // if player won with a 2-cards hand, it's because the hand is blackjack

         k = 1.5;

        money += bet;

       }

       playingRound = false;

      }

      else if (player.getValue() > 21)

      {

       cout << "Your cards: " << player << endl << endl;

       cout << "Dealer's cards: " << dealer << endl << endl;

       while (dealer.getValue() < 17)

       {

        Card c = deck.pop();

        c.showFace();

        dealer.add(c);

        cout << "Delaer drew: [" << dealer.getValue() << "] " << c << endl;

       }

       if (dealer.getValue() <= 21) // dealer wins

       {

        cout << "Dealer wins" << endl;

        money -= bet;

       }

       else if (dealer.getValue() > player.getValue()) // player wins

       {

        cout << "You won!" << endl;

        money += bet;

       }

       else if (dealer.getValue() == player.getValue()) // tie

       {

        cout << "It's a tie!" << endl;

       }

       playingRound = false;

      }

      // if the dealer's hand is less than 17, then take a new card

      if (dealer.getValue() < 17)

      {

       c = deck.pop();

       dealer.add(c);

      }

     }

     else if (input == 's' || input == 'S') // // stand

     {

      while (dealer.getValue() < 17)

      {

       Card c = deck.pop();

       c.showFace();

       dealer.add(c);

       cout << "Delaer drew: [" << dealer.getValue() << "] " << c << endl;

      }

      if (dealer.getValue() > 21 || dealer.getValue() < player.getValue()) // dealer wins

      {

       cout << "You won!" << endl;

       money += bet;

      }

      else if (dealer.getValue() > player.getValue()) // dealer wins

      {

       cout << "Dealer wins" << endl;

       money -= bet;

      }

      else // dealer's hand is equal to player's hand

      {

       cout << "It's a tie!" << endl;

      }

      playingRound = false;

     }

     else if (input == 'q' || input == 'Q') // quit

     {

      // player automatically loses

      cout << "You lost!" << endl;

      playingRound = false;

     }

    }

   }

   else

    cout << "You must place a bet between $10 and $1000 or less than the available money." << endl;

  }

  // ask if player wants to continue

  if (!playingRound)

  {

   cout << "Do you want to continue? (Y/N): ";

   cin >> input;

   if (input == 'n' || input == 'N' || input == 'y' || input == 'Y')

   {

    if (input == 'n' || input == 'N')

    {

     playing = false;

     cout << "Thanks for playing!" << endl;

    }

   }

  }

 }

}