2022-04-24-17822-원판돌리기
본문 바로가기
알고리즘 모음집/New 알고리즘

2022-04-24-17822-원판돌리기

by KyeongMin 2022. 4. 24.
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;
}

https://github.com/3DPIT/study/blob/master/02.studyData/10.Algorithm/2022/%EB%B0%B1%EC%A4%80%EC%BD%94%ED%85%8C/Algorithm/2022/04/0424/2022-04-24-17822-%EC%9B%90%ED%8C%90%EB%8F%8C%EB%A6%AC%EA%B8%B0.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글