SWexpertAcademy
6109. 추억의 2048게임
먼지의삶
2019. 8. 10. 00:13
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
int n;
int map[21][21];
int temp[21][21];
bool f[21];
int ans = 0;
int sum;
void move(int dir) {
if (dir == 1) {//down
for (int i = 0; i < n; i++) {
for (int j = 0; j < 20; j++)
f[j] = false;
for (int j = 0; j < n; j++) {
if (map[j][i] != 0) {
for (int k = j - 1; k >= 0; k--) {
if (map[k][i] != 0) {
if (map[k][i] == map[j][i]) {
if (f[k] == false) {
map[k][i] *= 2;
map[j][i] = 0;
f[k] = true;
break;
}
else {
if (k + 1 != j)
{
map[k + 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k + 1 != j)
{
map[k + 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == 0) {
if (map[k][i] == 0) {
map[k][i] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
if (dir == 2) {//up
for (int i = 0; i < n; i++) {
for (int j = 0; j < 20; j++)
f[j] = false;
for (int j = n - 1; j >= 0; j--) {
if (map[j][i] != 0) {
for (int k = j + 1; k < n; k++) {
if (map[k][i] != 0) {
if (map[k][i] == map[j][i]) {
if (f[k] == false) {
map[k][i] *= 2;
map[j][i] = 0;
f[k] = true;
break;
}
else {
if (k - 1 != j)
{
map[k - 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k - 1 != j)
{
map[k - 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == n - 1) {
if (map[k][i] == 0) {
map[k][i] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
if (dir == 3) {//LEFT
for (int j = 0; j < n; j++) {
for (int i = 0; i < 20; i++)
f[i] = false;
for (int i = 0; i < n; i++) {
if (map[j][i] != 0) {
for (int k = i - 1; k >= 0; k--) {
if (map[j][k] != 0) {
if (map[j][k] == map[j][i]) {
if (f[k] == false) {
map[j][k] *= 2;
f[k] = true;
map[j][i] = 0;
break;
}
else {
if (k + 1 != i)
{
map[j][k + 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k + 1 != i)
{
map[j][k + 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == 0) {
if (map[j][k] == 0) {
map[j][k] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
if (dir == 4) {//LEFT
for (int j = 0; j < n; j++) {
for (int i = 0; i < 20; i++)
f[i] = false;
for (int i = n - 1; i >= 0; i--) {
if (map[j][i] != 0) {
for (int k = i + 1; k < n; k++) {
if (map[j][k] != 0) {
if (map[j][k] == map[j][i]) {
if (f[k] == false) {
map[j][k] *= 2;
f[k] = true;
map[j][i] = 0;
break;
}
else {
if (k - 1 != i)
{
map[j][k - 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k - 1 != i)
{
map[j][k - 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == n - 1) {
if (map[j][k] == 0) {
map[j][k] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
}
int main() {
int tc;
cin >> tc;
for (int t = 1; t <= tc; t++) {
memset(map, 0, sizeof(map));
cin >> n;
string m;
cin >> m;
int dir = 0;
if (m == "up") {
dir = 1;
}
else if (m == "down")
dir = 2;
else if (m == "left") {
dir = 3;
}
else if (m == "right")
dir = 4;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
move(dir);
cout << '#' << t<<'\n';
for (int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cout << map[i][j] << " ";
}
cout << endl;
}
}
return 0;
}
D4주기엔 좀문제가 너무쉬운게아닐까
한D2에서 3이 가장적절할듯