전치행렬을 이해하고난뒤
상하의좌표와 좌우의 좌표를 스왑시키는 형태가 이해가 잘 되지 않아 복습을 진행하였다.
배열을 회전시키는결과값은 결국 좌표가 바뀌는 것이다.
이해안될때 이중포문의 좌표 할당을 손으로 그려보고 다시한번 이해할 필요가 있다.
#include<iostream>
using namespace std;
void Swap(int& sour, int& dest) //스왑 함수
{// temp(빈공간에) sour대입 sour에dest데입 dest에 temp에있던sour대입
int temp = sour;
sour = dest;
dest = temp;
}
void TransPose(int** matrix, int size) //전치행렬 자리바꾸기
{
for (int y = 0; y < size; y++)
{
for (int x = y+1; x < size; x++) //전치행렬 자리 확인
{
Swap(matrix[x][y], matrix[y][x]); // 이해 했음!
}
}
}
void ChangeUpDown(int** matrix, int size) //위아래 자리바꾸기
{
for (int y = 0; y < size/2; y++) //중앙을 기점으로 반쪽만 바귀기때문에 /2!
{ // C++에서 나누기는 몫을 나타내는것임을 잊지 않아야 한다.
for (int x = 0; x < size; x++)
{
Swap(matrix[x][y], matrix[x][size -1 -y]); //x는 그대로 y 좌표만 변경
}
}
}
void ChangeLeftRight(int** matrix, int size) //좌우 자리바꾸기
{
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size/2; x++)//중앙을 기점으로 반쪽만 바귀기때문에 /2!
{
Swap(matrix[x][y], matrix[size - 1 - x][y]); //y는 그대로 x 좌표만 변경
}
}
}
int main()
{
int size, input;
int** matrix;
cout << "큐브의 크기를 입력해 주세요 : "; cin >> size;
matrix = new int* [size];
for (int i = 0; i < size; i++) //포인터와 더블포인터로 int형 size크기의 힙영역에 배열공간생성
{
matrix[i] = new int[size];
}
for (int y = 0; y < size; y++) //매트릭스 가로세로size 크기의 배열생성
{
for (int x = 0; x < size; x++)
{
matrix[x][y] = y * size + x;
}
}
while(true)
{
system("cls");
for (int y = 0; y < size; y++) //매트릭스 가로세로size 크기의 배열 출력
{
for (int x = 0; x < size; x++)
{
cout << matrix[x][y] << "\t";
}
cout << endl;
}
cout << "회전할 방향을 선택해 주세요. [1]좌회전 / [2]오른쪽 : "; cin >> input;
if (input == 1)
{
TransPose(matrix, size); //전치행렬 교환
ChangeUpDown(matrix, size); //상하 교환
//전치행렬로 대각선 방향의좌표를 서로 교환하고
//x축의좌표 즉, 상하의 위치를 교환하면 좌회전한 배열과 같은형태가된다.
}
else if (input == 2)
{
TransPose(matrix, size); //전치행렬 교환
ChangeLeftRight(matrix, size); //좌우 교환
//좌회전과 마찬가지로 전치행렬로 교환한뒤
//상하가아닌 좌우의 좌표를 교환하면 우회전한 배열과 같은 형태가 된다.
}
else
{
cout << "잘못입력하셨습니다. 다시 입력해 주세요." << endl;
continue;
}
}
for (int i = 0; i < size; i++)
{
delete[] matrix[i]; //포인터사용후 할당 해제 잊지말자.
}
delete[] matrix; //마찬가지로 해제
return 0;
}
'공부' 카테고리의 다른 글
시험 오답 노트(복습용/비공개) (0) | 2022.11.13 |
---|---|
22.11.09 복습 (0) | 2022.11.09 |
[C++] 벡터(vector)와 벡터의 멤버함수 에 대하여 (0) | 2022.11.08 |
[C++] STL 에 대하여 (0) | 2022.11.08 |
복습2 - 연산자 (0) | 2022.11.08 |
댓글