==== 문제 ==== 2006-01-03 05:40:25 Accepted 0.012 Minimum 56031 C++ 10189 - Minesweeper ==== 소감 ==== 매우 평이한 문제이다. 방법은 여러가지가 있겠지만 아주 간단하게 2차원배열을 잡고 8가지 방향을 모두 조사해보는 방법을 사용하였다. 최대 입력의 크기가 100 x 100이므로 모두 조사해보는 방법도 매우 빠른시간안에 해결할 수 있다. 매우 하드코딩이라서 코드 라인수가 매우 길다 -.-;; ==== 어려웠던 점 ==== 이번에는 처음으로 Presentation Error를 여러번 받았다. 이것은 프로그램이 도출하는 답은 맞으나 출력형식이 잘못된 경우 발생한다. 이 문제는 출력세트별로 반드시 빈 줄을 추가하라고 했다. 이것이 매우 애매한 해석으로 이루어져서 코딩에 어려움을 겪었다. 결과적으로 이야기하면 하나의 출력세트가 있을 경우엔 밑에 빈 줄이 없어야하고 하나 이상일 때만 빈 줄이 있어야한다. 밑에 코드에서 if문으로 outputNumber > 1 인 부분이 Presentation Error를 벗어나게 하는 해결방법이었다. ==== 코드 ==== {{{~cpp // Minesweeper // UVa ID : 10189 // 2차원 배열에 데이터 입력은 (1,1) 부터 시작한다. #include //#include using namespace std; #define ArSize 102 void process(char data[][ArSize], int row, int col); void init_array(char data[][ArSize], int row, int col); void output(char data[][ArSize], int row, int col); //ifstream fin("input.txt"); int main() { char data[ArSize][ArSize]; int inputRow, inputCol; int outputNumber = 1; int i, j; while (cin >> inputRow >> inputCol) { // 종료조건 if ((inputRow == 0) && (inputCol == 0)) break; // 배열 초기화 (경계값까지 '.'으로 초기화) init_array(data, inputRow + 1, inputCol + 1); // 입력 (1,1)이 맨 처음이다. for (i = 1; i <= inputRow; i++) { for (j = 1; j <= inputCol; j++) { cin >> data[i][j]; } } // 지뢰 찾기 작업 process(data, inputRow, inputCol); // 출력 (출력이 하나인 경우는 밑에 빈칸을 두지 않는다!!) if (outputNumber > 1) cout << endl; cout << "Field #" << outputNumber++ << ":" << endl; output(data, inputRow, inputCol); } return 0; } void process(char data[][ArSize], int row, int col) { int i, j; char count = '0'; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { // 지뢰는 pass if (data[i][j] == '*') continue; else { // 북서 if (data[i - 1][j - 1] == '*') count++; // 북 if (data[i - 1][j] == '*') count++; // 북동 if (data[i - 1][j + 1] == '*') count++; // 동 if (data[i][j + 1] == '*') count++; // 동남 if (data[i + 1][j + 1] == '*') count++; // 남 if (data[i + 1][j] == '*') count++; // 남서 if (data[i + 1][j - 1] == '*') count++; // 서 if (data[i][j - 1] == '*') count++; data[i][j] = count; count = '0'; } } } } // 배열 초기화 void init_array(char data[][ArSize], int row, int col) { int i, j; for (i = 0; i <= row; i++) { for (j = 0; j <= col; j++) { data[i][j] = '.'; } } } // 출력 - 배열 내용 출력 void output(char data[][ArSize], int row, int col) { int i, j; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { cout << data[i][j]; } cout << endl; } } }}} ==== 덧글 ====