⚙️ 알고리즘/기타 문제 & 풀이

[C] 간단한 지뢰찾기(지뢰의 개수 출력)

dev_zoe 2020. 7. 17. 20:50
반응형

입력 : 지뢰는 문자 *로 하고 일반 셀은 #로 입력

출력 : 지뢰가 설치되어 있지 않은 셀 위치에 주변 지뢰의 개수 출력

EX)

입력 :

#####

#*###

##*##

#*###

###*#

 

출력:

11100

1*210

23*10

1*321

112*1

 

입력과 출력할 때 모두 2차원 배열 사용

 

#include<stdio.h>

#define X_VALUE 5 //2차원 배열의 행의 수
#define Y_VALUE 5 //2차원 배열의 열의 수

void readBombInfo(char grid[][Y_VALUE + 1]) {
	int i;
	// grid 및 지뢰 정보 입력 
	for (i = 0; i < X_VALUE; i++) 
		scanf("%s", grid[i]);
}

void countBomb(char grid[][Y_VALUE + 1], int numOfBombs[][Y_VALUE]) {
	int i, j;
	for (i = 0; i < X_VALUE; i++)
		for (j = 0; j < Y_VALUE; j++)
			if (grid[i][j] == '*') {
				//위의 세 셀
				if (i - 1 >= 0) {
					numOfBombs[i - 1][j]++;
					if (j - 1 >= 0)
						numOfBombs[i - 1][j - 1]++;
					if (j + 1 < Y_VALUE)
						numOfBombs[i - 1][j + 1]++;
				}

				//아래 세 쎌
				if (i + 1 < X_VALUE) {
					numOfBombs[i + 1][j]++;
					if (j - 1 >= 0)
						numOfBombs[i + 1][j - 1]++;
					if (j + 1 < Y_VALUE)
						numOfBombs[i + 1][j + 1]++;
				}

				//왼쪽
				if (j - 1 >= 0)
					numOfBombs[i][j - 1]++;
				//오른쪽
				if (j + 1 < Y_VALUE)
					numOfBombs[i][j + 1]++;
			}
}

void display_numOfBombs(char grid[][Y_VALUE + 1], int numOfBombs[][Y_VALUE]) {
	int i, j;
	printf("\n지뢰의 개수\n");
	for (i = 0; i < X_VALUE; i++) {
		for (j = 0; j < Y_VALUE; j++)
			if (grid[i][j] == '*')
				printf("*");
			else
				printf("%d", numOfBombs[i][j]);
		printf("\n");
	}
}

int main(void) {
	char grid[X_VALUE][Y_VALUE + 1]; //문자열의 경우 마지막에 NULL이 들어가야 하므로 // 5X5 배열이 아닌 5X6 배열이 되어야 한다.
	int numOfBombs[X_VALUE][Y_VALUE] = { 0 }; //지뢰의 개수를 넣는 정수형 5X5 배열
	readBombInfo(grid);
	countBomb(grid, numOfBombs);
	display_numOfBombs(grid, numOfBombs);
}
반응형