90 degree rotation of a 2D array in c++

Click For Summary

Discussion Overview

The discussion revolves around the implementation of a function to rotate a 2D array of strings by 90 degrees in C++. Participants are exploring the challenges associated with rotating both square and rectangular matrices, examining the code provided, and identifying potential issues in the rotation logic.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant is attempting to rotate a 2D array but finds that the rotation does not occur as expected, particularly for rectangular matrices.
  • Another participant suggests testing the function with different matrix sizes, such as 2x2 or 3x4, to observe the behavior of the rotation.
  • It is noted that the rotation works for square matrices but fails for rectangular ones, leading to confusion about the expected output.
  • Participants discuss the output of a specific rectangular matrix input, noting that the resulting output does not match the anticipated rotated form.
  • There is a suggestion that the program may need to be rewritten to handle the rotation correctly, particularly by creating a new output matrix with the appropriate dimensions.
  • One participant points out that the current implementation of the rotation function only exchanges elements without adjusting for the size of the output matrix.

Areas of Agreement / Disagreement

Participants generally agree that the current implementation does not correctly rotate rectangular matrices, and there is a consensus that a new output matrix should be created. However, there is no agreement on the exact implementation details or the best approach to fix the issues.

Contextual Notes

Limitations include the lack of a new output matrix in the current code, which is necessary for proper rotation of rectangular matrices. The discussion also highlights unresolved issues regarding the handling of matrix dimensions during the rotation process.

Absolutism
Messages
27
Reaction score
0

Homework Statement



I am trying to rotate a 2D array of type string. I am not sure what the problem is with my function. Flipping does occur but for some reason, it's not by 90.


Homework Equations





The Attempt at a Solution


The program consists of a function and the main. Here's the code (without all the declarations in the beginning)

function:
void rotate90(string &a, string &b, string &c, string &d)
{
string temp = a;
a = b;
b = c;
c = d;
d = temp;
}

Main: (rotation + output)

for(int i=0; i<arr_row/2; i++)
for(int j=0; j<(arr_col+1)/2; j++)
rotate90(a[j], a[arr_row-1-j], a[arr_row-1-i][arr_col-1-j], a[j][arr_col-1-i]); //error is here

//output of a 90 degree rotation
count<<"the matrix rotation"<<endl;
for (int i = 0; i< arr_row; i++) {
for (int j = 0; j< arr_col; j++) {
count << a[j] << " ";

can someone figure out where the error is in the rotation part? Thank you
 
Physics news on Phys.org
Hi Absolutism! :wink:

What is the error that you get?
Which matrices did you try?
 
I didn't get an error, but I guess they won't rotate because they're rectangular?
 
I think it does sort of rotate, but perhaps not the way it's supposed to.

Perhaps you could try the program with a couple of matrices?
Say a 2x2 one?
Or a 3x4 one?
 
yes, it worked for square matrices, but not for rectangular ones for some reason L:
 
What happened to a rectangular one?
 
if I input..
7 3 6
8 1 2

I get
1 8 7
2 6 3
 
Which matrix would you like to have had?
 
7 3 6
8 1 2

87
12
26
 
  • #10
Okay.
Your program "rotates" the matrix in place, keeping the number of rows and columns the same.
But the matrix you just wrote down has a different number of rows and columns (exchanged actually)...

Are you supposed to rewrite the program?
Or are you supposed to find and fix bugs in it?
 
  • #11
No, I am supposed to rewrite it
 
  • #12
In that case, shouldn't you create a new output matrix with the proper number of rows and columns?
 
  • #13
Yes, I tried that and compiled it, but it results in
73
81
62

so, it wouldn't rotate any more
 
  • #14
How does that program look?

Btw, perhaps you could put your program between [ code ]...[ /code ] tags (without the spaces)?
 
  • #15
The program looks quite messy L: However, the part in bold is the matrix rotation part.
Code:
#include <iostream>      
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

using  namespace  std;

[B]void rotate90(string a, string b, string c, string d)
{
   string temp = a;
   a = b;
   b = c;
   c = d;
   d = temp;
}
[/B]


int calc_occ (vector<vector<string> >a, vector<vector<string>> p )
{
int  a_rows = a.size( );
int  a_cols = a[0].size( );
int  p_rows = p.size( );
int  p_cols = p[0].size( );

int counter=0;
bool flag=false;
int x=0; int y=0; 
int i=0; int j=0;

while (a_cols!= i+x && p_cols!= j+y)
{
for (int i=0; i<p_rows; i++){
	for (int j=0; j<p_cols; j++)
{
	if (a[x+i][y+j]==p[i][j])
		flag = true; 
	if (flag = false){x++; y++;  break;} //outer loop increment x until rows then x=0 then y until last dimension 
}
	if (flag == true) {counter++; x= + p_rows; y= + p_cols; }
}

}
return counter; 
}

int  main ( )  {


ifstream infile1;
ifstream infile2;
infile1.open ("Array.txt");
infile2.open ("Pattern.txt");
if (!infile1||!infile2) {cout<<"error"; return -1;}

int arr_col, arr_row, pat_col, pat_row;
cout<<"Enter number of rows in your file (array)"<<endl;
cin>> arr_row;
cout<<"Enter Number of columns in your file (array)"<<endl;
cin>> arr_col;
   
string line; string word;
vector<vector<string> > a;

while(!infile1.eof())
{
getline(infile1, line);
istringstream stringline(line);
vector<string> b;
while(stringline >> word) {
b.push_back(word);
}
a.push_back(b);
}
//output
for (int i = 0; i< arr_row; i++) {                   
            for (int j = 0; j< arr_col; j++) {
                cout << a[i][j] << " ";
            }
            cout << endl;
    }

[B]//rotation

for(int i=0; i<arr_row/2; i++)
   for(int j=0; j<(arr_col+1)/2; j++)
       rotate90(a[i][j], a[arr_row-1-j][i], a[arr_row-1-i][arr_col-1-j], a[j][arr_col-1-i]);

//output of a 90 degree rotation
cout<<"the matrix rotation"<<endl;
for (int i = 0; i<arr_col; i++) {                   
            for (int j = 0; j<arr_row; j++) {
                cout << a[i][j] << " ";
            }
            cout << endl;
    }[/B]

cout<<"Enter number of rows in your file (pattern)"<<endl;
cin>> pat_row;
cout<<"Enter Number of columns in your file (pattern)"<<endl;
cin>> pat_col;


vector<vector<string> > p;
while(!infile2.eof())
{
getline(infile2, line);
istringstream stringline(line);
vector<string> c;
while(stringline >> word) {
c.push_back(word);
}
p.push_back(c);
}

for (int i = 0; i< pat_row; i++) {                    //output of array
            for (int j = 0; j< pat_col; j++) {
                cout << p[i][j] << " ";
            }
            cout << endl;
    }




}
 
  • #16
Well, your rotate90() function exchanges elements in the matrix "a".
But a has the wrong size for the output.

So it seems to me that you should create a new output matrix (which I don't see in your current code), and you should copy entries from the matrix "a" to this output matrix in a different position.
 

Similar threads

  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 18 ·
Replies
18
Views
3K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 7 ·
Replies
7
Views
2K
Replies
1
Views
2K
  • · Replies 21 ·
Replies
21
Views
3K