코딩테스트/시뮬레이션
[시뮬레이션(회전)] (CHECK) 프로그래머스 자물쇠와 열쇠 C++
유(YOO)
2023. 2. 19. 00:26
https://school.programmers.co.kr/learn/courses/30/lessons/60059
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
/*
정방향 오른쪽 90도 180도 왼쪽 90도
00 01 02 02 12 22 22 21 20 20 10 00
10 11 12 01 11 21 12 11 10 21 11 01
20 21 22 00 10 20 02 01 00 22 12 02
*/
int N, M, SIZE;
int board[60][60], temp[60][60];
bool checkLock() {
for(int p=M; p<M+N; p++) {
for(int q=M; q<M+N; q++) {
if (temp[p][q] == 0) return false;
}
}
return true;
}
bool checkKey(vector<vector<int>> key, int i, int j) {
copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
for(int p=0; p<M; p++) {
for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[p][q];
}
if (checkLock()) return true;
copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
for(int p=0; p<M; p++) {
for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[q][M-p-1]; // 왼쪽 90도 회전
}
if (checkLock()) return true;
copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
for(int p=0; p<M; p++) {
for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[M-p-1][M-q-1]; // 180도 회전
}
if (checkLock()) return true;
copy(&board[0][0], &board[SIZE-1][SIZE], &temp[0][0]);
for(int p=0; p<M; p++) {
for(int q=0; q<M; q++) temp[i+p][j+q] ^= key[M-q-1][p]; // 오른쪽 90도 회전
}
if (checkLock()) return true;
return false;
}
bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
N = lock.size();
M = key.size();
SIZE = N + M * 2;
fill(&board[0][0], &board[SIZE-1][SIZE], 0); // 60 * 60 * (20 * 20 * 8)
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) board[M+i][M+j] = lock[i][j];
}
for(int i=0; i<SIZE-M; i++) {
for(int j=0; j<SIZE-M; j++) {
if (checkKey(key, i, j)) return true;
}
}
return false;
}