본문 바로가기
4_ 고소한 알고리즘

C- ACM - 지뢰찾기

by 준환이형님_ 2010. 6. 23.

 

지뢰찾기 게임을 구현합니다~ 지뢰위치는 '*'로 나타내고 그렇지 않다면 주변 8 방향의 지뢰매설 개수를 표시합니다.
저는 배열이 좋은데.. 이번에는 동적으로 구현 해 보았어요. 이렇게 하면 평당 얼마의 메모리 비용으로 저렴하게 지뢰밭을 만들 수 있겠죠~ㅋ
내용은 for문에 따라 [동적배열생성]->[지뢰생성]->[표시]->[메모리해제] 순서입니다. 지뢰 찾으러 갑시당~♪

 
#include 
#include 
#include 
#include 

int main(void)
{
	srand((unsigned int)time(NULL));	//랜덤seed설정
	int N,M,counter;
	int **mine_farm;

	scanf("%d %d", &N, &M);

	N+=2;M+=2; // 마스크로 인해 끝부분이 두칸씩 잘리게 되므로 처음부터 두칸 넓게 잡음

	mine_farm=(int**)malloc(N*sizeof(int)); // 동적배열(행)

	for(int i=0; i<N; i++)
	{
		*(mine_farm+i)=(int*)malloc(sizeof(int)*M); // 동적배력(열)
	}

	for(int i=0; i<N; i++)
	{
		for(int j=0; j<M; j++)
		{			
			if(i==0 || j==0 || i==N-1 || j==M-1){continue;}	//마스크는 패스
			if(rand()%4){mine_farm[i][j]=NULL;}else mine_farm[i][j]=1;	// 1/4확률의 지뢰생성	
		}
	}

	for(int i=0; i<N; i++)
	{
		for(int j=0; j<M; j++)
		{
			if(i==0 || j==0 || i==N-1 || j==M-1){continue;}
			if(mine_farm[i][j]==1){printf("* ");continue;}	// 지뢰를 "*"표시

			counter=NULL;

			for(int l=-1; l<2; l++)
			{
				for(int m=-1; m<2; m++)
				{
					if(mine_farm[i+l][j+m]==1){counter++;}	//마스크내의 *은 카운터를 셈
				}
			}
			if(i==0 || j==0 || i==N-1 || j==M-1){continue;}
			printf("%d ",counter);	// 나머지는 숫자표현
		}
		printf("\n");
	}

	for(int i=0; i<N; i++)
	{
		free(mine_farm[i]);	// 메모리해제
	}
	free(mine_farm);

	return 0;
}

'4_ 고소한 알고리즘' 카테고리의 다른 글

C- ACM - 양말 짝 맞추기  (0) 2010.07.02
C- ACM - 다운로드  (0) 2010.07.02
C- ACM - 수 뒤집기  (0) 2010.06.12
C- ACM - 소수판정  (0) 2010.06.09
C- ACM - 문자열  (0) 2010.06.08