U E D R , A S I H C RSS

Minesweeper/��현

문제

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 <iostream>
//#include <fstream>
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;
	}
}

�글

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:46
Processing time 0.2680 sec