문제 : 지뢰찾기를 해본 적이 있는 사람이 많을 것이다. 지뢰찾기는 M*N의 지뢰밭에서 모든 지뢰의 위치를 찾는 게임이다
이 게임에서는 각 칸에 인접한 칸에 몇 개의 지뢰가 있는지를 보여준다. 각 칸에는 최대 여덟 개의 인접한 칸이 있을 수 있다.
지뢰는 * 문자로 표시되어 있다. 출력시에는 지뢰의 위치를 -100 으로 출력한다.
입력 예:)
4 4
*...
....
.*..
출력 예
-100 1 0 0
2 1 0 0
1 -100 1 0
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
제가 구현한것..
간단하게 문자 배열로 받고 이것을 하나하나 파싱해서 정수형 배열에다가 옮겼어요..
(우선 배열은 크게 100*100으로 잡아도 상관없습니다. 굳히 동적할당을 하지 않아도 되고 이렇게 해도 되서..)
우선 제가 구현한 부끄러운 소스를 공개합니다 ㅠ_ㅠ (아직 프로그래밍 신입생;;)
#include<iostream>
using namespace std;
int main () {
int x, y, i, j;
char input[100][100]={0}; // 문자열 입력받기 위해
int map[100][100]={0}; // 출력용 정수형 배열
// 먼저 X Y 입력받고
cin >> x >> y;
// 문자열로 지뢰밭을 입력받음
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
cin >> input[i][j];
}
}
cout <<"입력종료 ";
// 지뢰밭을 출력할 배열에 하나하나 조건검사를 하면서 포팅시작
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
if(input[i][j]=='*') {
map[i-1][j-1]++;
map[i-1][j]++;
map[i-1][j+1]++;
map[i][j+1]++;
map[i][j]=-100;
map[i][j-1]++;
map[i+1][j-1]++;
map[i+1][j]++;
map[i+1][j+1]++;
}
}
}
// 결과값 출력
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
cout << map[i][j] <<" ";
}
cout << " ";
}
cout << "끝 ";
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 제가 이해가 안되는 부분은 다음과 같습니다 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
그런데 제가 아래 구현한 것에서 문제는 배열의 맨 원쪽 맨 윗칸에 지뢰가 있을때..
map[-1][-1] 일때 에러가 날때가 있고 안날때가 있다는 것입니다... ㅡ.ㅡ;;
참 특이하네요 에러가 나면 나고 안나면 안나야되는데..
분석좀 해주시면 정말 감사하겠습니다 ㅠㅠ
도저히 왜 저렇게 나오는지 이해가 안되네요...
2x2 로 입력값을 받았을때 스크린샷을 첨부합니다..
분명히 여기에 봣을땐
map[0][1]에 지뢰가 있으니깐 지뢰가 있는 위치부터 시작해서 8방면을 검사하게 됩니다.
그렇게 된다면 분명히 map[-1][0], map [-1][1], map [-1][2] 에서 에러가 나야하는데... 에러가 안나고 잘돌아갑니다 ㅡ.ㅡ;;
그렇다면 아래 화면을 보시죠..ㅠㅠ
이놈은 당연히 예상대로 에러가 나게 됩니다....
이놈도 나고... (예상햇던 결과였습니다... 왜냐면 배열할당 범위를 넘어서 검사를 하게 되니깐요.. 첨자가 마이너스가 된 상태로 검사하니)
이놈은 에러가 안나는 것이 이해가 됩니다.. 애초부터 map[100][100] 을 할당했으니깐요...
하지만 왜 맨 처음 화면은 에러가 나지 않는 것인가요??
너무 궁금합니다 ㅠㅠㅠ
제가 아직 배열을 이해 못하고 있는 것인가요..ㅠㅠ
니가 선언한 배열의 범위를 벗어난 곳에 접근을 하게 되면 그림처럼 에러를 뿜는다. map[-1][0] 처럼 말이지
마지막 사진은 당연히 map[1][1] 에서 시작해서 map[0][0]~map[2][2]까지 선언된 부분만 건드려주니 에러가 안나는거고
첫번째 사진은 왜 에러가 안나는지 모르겠지만 어쨋든 잘못된 방법이다. 그자리에 쓰레기값이 아닌 무언가가 선언이 되어 있어서 에러가 안 나는거 같다.
이럴 때 예외처리를 해주는거지 if( (i-1 < 0) || (j-1 < 0) || (i+1 > 99) || (j+1 > 99) ) continue; 이런식으로
학교시험보는거같노
간단하게 해결했습니다
간단하게 시작값을 1로 주니깐 해결되는군요 감사합니다.
for 문에서 i시작값을 0으로 하지 않고 1로 주니깐간단하네요 ㅋㅋ