본문 바로가기

대학교 1-2/컴프

HW지뢰찾기

프로그램을 위하여 입력을 다음과 같이 한다. 지뢰는 문자 * 로 표시하고 일반 셀은 #으로 표시한다.

입력의 예는 아래와 같다.

#####

#*###

##*##

#*###

###*#

결과는 지뢰가 설치되어 있지 않은 셀 위치에 주변 지뢰의 개수를 출력한다.

위 예제의 결과는 아래와 같다.

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

 

'대학교 1-2 > 컴프' 카테고리의 다른 글

HW6_2  (1) 2023.10.12
Project1  (1) 2023.10.12
HW5a  (0) 2023.10.09
HW5a_2  (0) 2023.10.04
LAB5a_2  (0) 2023.10.04