#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m;
int n;
int Number = 2;
scanf("%d %d", &m, &n);
char **matrix = malloc(sizeof(char *) * m);
for (int a = 0; a < m; a++)
{
matrix[a] = malloc(sizeof(char)*n);
}
for (int a = 0; a < m; a++)
{
for (int b = 0; b < n; b++)
{
scanf("%c", matrix[a][b]);
}
}
for (int A = 0; A < m; A++)
{
for (int B = 0; B < n; B++)
{
if (matrix[A][B] == '*')
{
continue;
}
else
{
for (int a = A - 1; a <= A + 1; a++)
{
for (int b = B - 1; b <= B + 1; b++)
{
if (a < 0 || b < 0 || a >= A || b >= B)
{
continue;
}
else if (matrix[a][b] = '*')
{
Number++;
}
else
{
continue;
}
}
}
matrix[A][B] += Number;
}
printf("%c ", matrix[A][B]);
}
printf("\n");
}
for (int C = 0; C < m; C++)
{
free(matrix[C]);
}
free(matrix);
return 0;
}
원리는 잘 맞춘 것 같은데 어디를 고쳐야 할지 모르겠네요..
문의한 코드를 실행한 결과는 다음과 같습니다.
5 5
문제가 원하는 입력은 다음과 같습니다.
5 5
*....
.*.**
.*...
.....
.....
입력부터 제대로 되게 만들어야 합니다.
심사문제를 제출하면 나오는 해설을 참고하면 코드를 고칠 수 있는 부분이 보일 겁니다.
또한, 포럼 상단에서 38.8로 검색하면 이전 질문을 참고할 수 있습니다.
for (int i = 0; i < m; i++)
{
scanf("%s", matrix[i]);
}
이 부분에서 여러줄을 입력 받으면 자동으로 배열이 만들어 지는 것이라 이해했는데, 왜 이렇게 되는지 이해가 되지 않고
문자열로 메모리를 할당할 때는 n + 1(가로 크기 + 1)만큼 할당하여 NULL이 들어갈 공간까지 확보해야 한다는 설명을 보았는데 이것도 이해가 잘 되지 않습니다.. 가로 줄에 문자열을 입력한다면 컴퓨터가 알아서 배열은 만드는 건가요?
1. 여러 줄을 입력받기 위해 반복문과 배열을 사용했습니다.
반복문과 배열 관련 Unit을 다시 살펴보세요.
2. 문자열은 끝에 NULL이 들어갑니다. 해당 부분은 문제에도 언급한 것처럼 Unit 39를 참고하세요. 문제를 푸는 데는 n + 1이라는 것만 알면 됩니다.
문자를 일렬로 나열한 배열 = 문자열입니다. 문자열을 위한 별도의 타입은 없습니다. 문자 배열 = 문자열입니다. 따라서 문자열은 char 배열로 접근할 수 있습니다.
char string[] = "Hello";
이렇게 되어 있으면 string[0]는 'H' 문자이고, string[1]은 'e' 문자입니다.
문자열에 대한 자세한 내용은 Unit 39에 설명되어 있습니다.
string 배열의 크기는 6이 됩니다. "Hello" + NULL 문자이기 때문입니다. Unit 39를 참고하세요.
문제에서 지뢰찾기는 2차원 배열을 생성하는 문제입니다. 그리고 가로에는 문자열로 입력 받아 한 번에 값을 넣을 수 있습니다.
문자 하나씩 입력을 받는다면 문제의 입력 예시는 다음과 같아야 합니다.
. . * . .
그렇다면 scanf도 "%c %c %c %c %c"로 입력 받아야 합니다.(물론, 지뢰찾기의 크기는 유동적이므로 반복문을 이용해 유동적으로 처리해야 합니다.)