728x90
반응형
01.시계방향또는 반시계방향으로 이동하기
void clockArr(int idx, int arr[MS]) {
int copy = arr[M-1];
for (int i = M-1; i >0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = copy;
}
void clockArrReverse(int idx, int arr[MS]) {
int copy = arr[0];
for (int i = 0; i <M-1; i++) {
arr[i] = arr[i +1];
}
arr[M-1] = copy;
}
02.dfs 같은수 숫자 제거하기
void dfs(int y, int x, int number) {
for (int dir = 0; dir < 4; dir++) {
int ny = y + dy[dir]; int nx = x + dx[dir];
if (nx < 0) nx = M-1;
if (nx == M) nx = 0;
if (0<=ny&&ny<N&&visit[ny][nx] == 0 && board[ny][nx] == number) {
flag = 1;
board[ny][nx] = 0;
visit[ny][nx] = 1;
dfs(ny, nx, number);
}
}
}
03.제거못하는 경우 평균 구해서 빼기
if (retSum == 0) {//제거 못하는 경우
double number = 0; int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] != 0) {
number += board[i][j];
count++;
}
}
}
double avgNumber = number / count;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] != 0) {
if (board[i][j] > avgNumber) {
board[i][j]--;
}
else if (board[i][j] < avgNumber) {
board[i][j]++;
}
}
}
}
}
- 여기서 주의
- double = int / count;
- double= double/ count;
- 두개의 차이가 있음 제대로 하려면 더블로 해서 계산을 해야함
- 형변환 절대 주의 할 것
04.전체소스
#include<stdio.h>
#include<iostream>
#include<string.h>
#define NS 51
#define MS 51
using namespace std;
int N, M,T, ret;
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
int visit[NS][MS];
int board[NS][MS];
int X, D, K;
int flag = 0;
void init() {
N = M = T=ret = 0;
scanf("%d %d %d", &N, &M, &T);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &board[i][j]);
}
}
}
void clockArr(int idx, int arr[MS]) {
int copy = arr[M-1];
for (int i = M-1; i >0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = copy;
}
void clockArrReverse(int idx, int arr[MS]) {
int copy = arr[0];
for (int i = 0; i <M-1; i++) {
arr[i] = arr[i +1];
}
arr[M-1] = copy;
}
void dfs(int y, int x, int number) {
for (int dir = 0; dir < 4; dir++) {
int ny = y + dy[dir]; int nx = x + dx[dir];
if (nx < 0) nx = M-1;
if (nx == M) nx = 0;
if (0<=ny&&ny<N&&visit[ny][nx] == 0 && board[ny][nx] == number) {
flag = 1;
board[ny][nx] = 0;
visit[ny][nx] = 1;
dfs(ny, nx, number);
}
}
}
void play() {
for (int t = 0; t < T; t++) {
scanf("%d %d %d", &X, &D, &K);
if (D == 0) {
for (int i = 0; i < N; i++) {
if ((i+1)%X == 0) {
for (int k = 0; k < K; k++) {
clockArr(i, board[i]);
}
}
}
}
else if (D == 1) {
for (int i = 0; i < N; i++) {
if ((i+1)%X == 0) {
for (int k = 0; k < K; k++) {
clockArrReverse(i, board[i]);
}
}
}
}
int retSum = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j]!=0&&visit[i][j] == 0) {
flag = 0;
int copyNumber = board[i][j];
visit[i][j] = 1;
dfs(i, j, board[i][j]);
if (flag == 1)board[i][j] = 0;
retSum += flag;
}
}//for j
}//for i
memset(visit, 0, sizeof(visit));
if (retSum == 0) {//제거 못하는 경우
double number = 0; int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] != 0) {
number += board[i][j];
count++;
}
}
}
double avgNumber = number / count;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] != 0) {
if (board[i][j] > avgNumber) {
board[i][j]--;
}
else if (board[i][j] < avgNumber) {
board[i][j]++;
}
}
}
}
}
}//for t
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
ret += board[i][j];
}
}
}
int main(void) {
init();
play();
printf("%d\n", ret);
return 0;
}
728x90
반응형
'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글
2022-04-24-19237-어른상어 (0) | 2022.04.25 |
---|---|
2022-04-24-19236-청소년-상어 (0) | 2022.04.25 |
2022-04-23-17140-이차원배열과연산 (0) | 2022.04.23 |
2022-04-23-17141-연구소2,17142연구소3 (0) | 2022.04.23 |
2022-04-22-17143-낚시왕 (0) | 2022.04.22 |
댓글