반응형
다른 공과 부딪혔을 때 같은 크기가 아닌경우 그 이후 좌표에 공이 들어가야 하는데 그 이후 좌표가 자신의 기존 좌표랑 다른 경우에만 수행 따라서 부딪히고 크기 다른데 그 이후좌표가 자신과 같다면 그냥 break
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
string str;
int arr[20][20];
bool visit[20][20];
int N;
void up()
{
memset(visit, 0, sizeof(visit));
for (int j = 0; j < N; j++)
{
for (int i = 0; i < N; i++)
{
if (arr[i][j])
{
int idx = i - 1;
bool flag = false;
while (idx >= 0)
{
if (arr[idx][j])
{
flag = true;
if (arr[idx][j] == arr[i][j] && !visit[idx][j])
{
visit[idx][j] = true;
arr[idx][j] *= 2;
arr[i][j] = 0;
break;
}
else
{
if (idx + 1 != i)
{
arr[idx + 1][j] = arr[i][j];
arr[i][j] = 0;
}
break;
}
}
else
{
idx--;
}
}
idx++;
if (!flag && idx != i)
{
arr[idx][j] = arr[i][j];
arr[i][j] = 0;
}
}
}
}
}
void down()
{
memset(visit, 0, sizeof(visit));
for (int j = 0; j < N; j++)
{
for (int i = N-1; i >= 0; i--)
{
if (arr[i][j])
{
int idx = i + 1;
bool flag = false;
while (idx < N)
{
if (arr[idx][j])
{
flag = true;
if (arr[idx][j] == arr[i][j] && !visit[idx][j])
{
visit[idx][j] = true;
arr[idx][j] *= 2;
arr[i][j] = 0;
break;
}
else
{
if (idx - 1 != i)
{
arr[idx - 1][j] = arr[i][j];
arr[i][j] = 0;
}
break;
}
}
else
{
idx++;
}
}
idx--;
if (!flag && idx != i)
{
arr[idx][j] = arr[i][j];
arr[i][j] = 0;
}
}
}
}
}
void left()
{
memset(visit, 0, sizeof(visit));
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (arr[i][j])
{
int idx = j - 1;
bool flag = false;
while (idx >= 0)
{
if (arr[i][idx])
{
flag = true;
if (arr[i][idx] == arr[i][j] && !visit[i][idx])
{
visit[i][idx] = true;
arr[i][idx] *= 2;
arr[i][j] = 0;
break;
}
else
{
if (idx + 1 != j)
{
arr[i][idx + 1] = arr[i][j];
arr[i][j] = 0;
}
break;
}
}
else
{
idx--;
}
}
idx++;
if (!flag && idx != j)
{
arr[i][idx] = arr[i][j];
arr[i][j] = 0;
}
}
}
}
}
void right()
{
memset(visit, 0, sizeof(visit));
for (int i = 0; i < N; i++)
{
for (int j = N-1; j >= 0; j--)
{
if (arr[i][j])
{
int idx = j + 1;
bool flag = false;
while (idx < N)
{
if (arr[i][idx])
{
flag = true;
if (arr[i][idx] == arr[i][j] && !visit[i][idx])
{
visit[i][idx] = true;
arr[i][idx] *= 2;
arr[i][j] = 0;
break;
}
else
{
if (idx - 1 != j)
{
arr[i][idx - 1] = arr[i][j];
arr[i][j] = 0;
}
break;
}
}
else
{
idx++;
}
}
idx--;
if (!flag && idx != j)
{
arr[i][idx] = arr[i][j];
arr[i][j] = 0;
}
}
}
}
}
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
/*
여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
*/
for (test_case = 1; test_case <= T; ++test_case)
{
cin >> N >> str;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> arr[i][j];
}
}
if (str == "up")
{
up();
}
else if (str == "down")
{
down();
}
else if (str == "left")
{
left();
}
else if (str == "right")
{
right();
}
cout << "#" << test_case << endl;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형
'Algorithm' 카테고리의 다른 글
4301. 콩 많이 심기 (0) | 2020.04.29 |
---|---|
4050. 재관이의 대량 할인 (0) | 2020.04.28 |
5432. 쇠막대기 자르기 (0) | 2020.04.26 |
2019 KAKAO BLIND RECRUITMENT실패율 (0) | 2020.04.24 |
6731. 홍익이의 오델로 게임 (0) | 2020.04.24 |