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

1. Apr 17, 2012

### Absolutism

1. The problem statement, all variables and given/known data

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.

2. Relevant equations

3. 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
cout<<"the matrix rotation"<<endl;
for (int i = 0; i< arr_row; i++) {
for (int j = 0; j< arr_col; j++) {
cout << a[j] << " ";

can someone figure out where the error is in the rotation part? Thank you

2. Apr 17, 2012

### I like Serena

Hi Absolutism!

What is the error that you get?
Which matrices did you try?

3. Apr 17, 2012

### Absolutism

I didn't get an error, but I guess they won't rotate because they're rectangular?

4. Apr 17, 2012

### I like Serena

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?

5. Apr 17, 2012

### Absolutism

yes, it worked for square matrices, but not for rectangular ones for some reason L:

6. Apr 17, 2012

### I like Serena

What happened to a rectangular one?

7. Apr 17, 2012

### Absolutism

if I input..
7 3 6
8 1 2

I get
1 8 7
2 6 3

8. Apr 17, 2012

### I like Serena

Which matrix would you like to have had?

9. Apr 17, 2012

### Absolutism

7 3 6
8 1 2

87
12
26

10. Apr 17, 2012

### I like Serena

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. Apr 17, 2012

### Absolutism

No, I am supposed to rewrite it

12. Apr 17, 2012

### I like Serena

In that case, shouldn't you create a new output matrix with the proper number of rows and columns?

13. Apr 17, 2012

### Absolutism

Yes, I tried that and compiled it, but it results in
73
81
62

so, it wouldn't rotate any more

14. Apr 17, 2012

### I like Serena

How does that program look?

Btw, perhaps you could put your program between [ code ]...[ /code ] tags (without the spaces)?

15. Apr 17, 2012

### Absolutism

The program looks quite messy L: However, the part in bold is the matrix rotation part.
Code (Text):
#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 dimention
}
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. Apr 17, 2012

### I like Serena

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.