지우너
[코드트리] 십자 모양 폭발 C++ 본문
문제
https://www.codetree.ai/missions/2/problems/cross-shape-bomb?&utm_source=clipboard&utm_medium=text
계획 세우기
- 폭발: r, c가 주어지면 arr[r][c]-1 범위로 상하좌우를 0으로 만들고, arr[r][c]를 0으로 만든다.
- 중력: n-1부터 0까지 row를 보면서 0이 나오면 0이 아닌 idx를 찾아 교환한다. (이 과정을 col만큼 반복한다)
풀이
#include <iostream>
using namespace std;
int n;
int arr[201][201]; //1이상 100이하의 숫자로 구성
void PrintArr(){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout << arr[i][j] << " ";
}
cout << '\n';
}
}
void GravitationalActions(){
for(int col=0; col<n; col++){
int endOfIdx=-1;
for(int row=n-1; row>0; row--){
if(arr[row][col]==0){
endOfIdx=row;
int x=row;
while(arr[x][col]==0){
x--;
if(x<0) break;
}
if(x<0) continue;
arr[endOfIdx][col]=arr[x][col];
arr[x][col]=0;
endOfIdx-=1;
}
}
}
}
void Explode(int r, int c){
// 좌(0,-1)상(-1,0)우(0,1)하(1,0)
int dx[4]={0, -1, 0, 1};
int dy[4]={-1, 0, 1, 0};
int explosionRange = arr[r][c]-1;
for(int dir=0; dir<4; dir++){
if(explosionRange==0) break;
int x=r, y=c;
for(int move=0; move<explosionRange; move++){
x+=dx[dir];
y+=dy[dir];
if(x<0 || x>=n || y<0 || y>=n) break; //같은 방향으로 가니까 한 번 범위를 벗어나면 쭉 벗어남
arr[x][y]=0; // 범위를 벗어나지 않으면 폭발시키기
}
}
arr[r][c]=0;
GravitationalActions();
}
int main() {
//input
cin >> n;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin >> arr[i][j];
}
}
int r, c;
cin >> r >> c;
Explode(r-1, c-1);
PrintArr();
return 0;
}
'Problem Solving' 카테고리의 다른 글
[코드트리] 1차원 폭발 게임 C++ (0) | 2024.06.08 |
---|---|
[코드트리] 숫자가 더 큰 인접한 곳으로 이동 C++ (0) | 2024.06.07 |
[코드트리] 1차원 젠가 C++ (0) | 2024.06.06 |
[코드트리] 최단 Run Length 인코딩 C++ (0) | 2024.06.06 |
[코드트리] 기울어진 직사각형의 회전 C++ (0) | 2024.06.05 |