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

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
15 replies · 8K views
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
I didn't get an error, but I guess they won't rotate because they're rectangular?
 
yes, it worked for square matrices, but not for rectangular ones for some reason L:
 
if I input..
7 3 6
8 1 2

I get
1 8 7
2 6 3
 
7 3 6
8 1 2

87
12
26
 
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?
 
No, I am supposed to rewrite it
 
Yes, I tried that and compiled it, but it results in
73
81
62

so, it wouldn't rotate any more
 
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;
    }




}
 
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.