프로그램을 위하여 입력을 다음과 같이 한다. 지뢰는 문자 * 로 표시하고 일반 셀은 #으로 표시한다.
입력의 예는 아래와 같다.
#####
#*###
##*##
#*###
###*#
결과는 지뢰가 설치되어 있지 않은 셀 위치에 주변 지뢰의 개수를 출력한다.
위 예제의 결과는 아래와 같다.
11100
1*210
23*10
1*321
112*1
그리드와 결과를 저장하기 위해 2차원 배열을 사용할 것이다. 위의 예제에서는 크기가 5X5인 2차원 배열이 사용된다. 프로그램의 일부 코드는 다음과 같다. 여러분이 해야 할 일은 아래 프로그램을 완성하는 것이다. 다양한 test case로 실행시켜보라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include<stdio.h>
#define X_VALUE 5 //2차원 배열의 행의 수
#define Y_VALUE 5 //2차원 배열의 열의 수
void readBombInfo(char grid[][Y_VALUE+1])
{
int i;
// grid 및 지뢰 정보 입력
printf("Input Grid\n");
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] == '*') {
// 여기에 지뢰의 개수를 세어 numOfBombs에 넣는 코드 작성
}
}
void display_numOfBombs(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] == '*')
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);
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define X_VALUE 5 //2차원 배열의 행의 수
#define Y_VALUE 5 //2차원 배열의 열의 수
void readBombInfo(char grid[][Y_VALUE + 1])
{
int i;
// grid 및 지뢰 정보 입력
printf("Input Grid\n");
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] == '*') {// 여기에 지뢰의 개수를 세어 numOfBombs에 넣는 코드 작성
for (int p = i - 1; p <= i + 1; p++)
for (int q = j - 1; q <= j + 1; q++)
if (p >= 0 && p < X_VALUE && q >= 0 && q < Y_VALUE)
numOfBombs[p][q]++;
}
}
void display_numOfBombs(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] == '*')
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);
}
|
cs |
처음에 countBomb부분을
for (int p = i - 1; p <= i + i; p++)
for (int q = j - 1; q <= j + 1; j++){
numOfBombs[p][q]++;
if (p > X_VALUE || p < 0)
//증가시키지 않는다
if(q > Y_VALUE || q < 0)
//증가시키지 않는다
}
라고 생각햇다 그래서 증가시키지 않는다 부분 코드를 고민했다
하지만 알고보니 특정경우 증가시키지 않는 경우보다는 특정경우에만 증가시키는 쪽으로 코드를 짰다
근데 저거 if문 안써도 돌아가긴 한다
--------------------------------------------------------------------------------------------------------
if (grid[i][j] == '*') { // 여기에 지뢰의 개수를 세어 numOfBombs에 넣는 코드 작성
for (int p = i - 1; p <= i + 1; p++)
for (int q = j - 1; q <= j + 1; q++)
if (p >= 0 && p < X_VALUE && q >= 0 && q < Y_VALUE)
numOfBombs[p][q]++;
}
이 부분을 수정해 보았다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
if (grid[i][j] == '*') {// 여기에 지뢰의 개수를 세어 numOfBombs에 넣는 코드 작성
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 + 1][j - 1]++;
if (j + 1 <= 4)
numOfBombs[i][j + 1]++;
}
|
cs |