본문 바로가기
프로그램/C++ 1000제

C++ 78제] 어서와 C++는 처음이지! p112 도전문제.

by 건티 2022. 9. 30.
728x90

출처] 반크_세계유산 창덕궁

 

참고풀이]

#include <iostream>
#include <cstdlib> //srand(), rand()
#include <time.h> //time()
#include <iomanip> //setw()
using namespace std;

int main()
{
bool board[10][10]={0};
int MineCnt[10][10]={0};//이웃한 지뢰의 수를 구한다. 
char Game[10][10]={'\0'};//게임의 결과 입력할 배열 
int i,j;
int r,c;//게이머가 선택한 행열 위치변수 
int cnt;//지뢰수 카운트 변수
int chk;//계속 0인지 체크하는 변수 

srand(time(NULL));

//난수를 발생하여 30%확률로 지뢰를 저장한다. 
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if((rand()%100)<30)
board[i][j]=true;

//게임판을 초기값을 셋팅한다.
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Game[i][j]='@';

//이웃한 지뢰의 수를 구한다. 
cnt=0;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(board[i][j])
{
MineCnt[i][j]=9;
cnt++;//총 지뢰의 수를 센다. 

else
{
if(i==0 && j==0)
{
if(board[i][j+1]) MineCnt[i][j]++;
if(board[i+1][j]) MineCnt[i][j]++;
if(board[i+1][j+1]) MineCnt[i][j]++;
}
else if(i==0 && j==9)
{
if(board[i][j-1]) MineCnt[i][j]++;
if(board[i+1][j]) MineCnt[i][j]++;
if(board[i+1][j-1]) MineCnt[i][j]++;
}
else if(i==9 && j==0)
{
if(board[i][j+1]) MineCnt[i][j]++;
if(board[i-1][j]) MineCnt[i][j]++;
if(board[i-1][j+1]) MineCnt[i][j]++;
}
else if(i==9 && j==9)
{
if(board[i][j-1]) MineCnt[i][j]++;
if(board[i-1][j]) MineCnt[i][j]++;
if(board[i-1][j-1]) MineCnt[i][j]++;
}
else if(i==0 && (j>0 && j<9))
{
if(board[i][j-1]) MineCnt[i][j]++;
if(board[i][j+1]) MineCnt[i][j]++;
if(board[i+1][j-1]) MineCnt[i][j]++;
if(board[i+1][j]) MineCnt[i][j]++;
if(board[i+1][j+1]) MineCnt[i][j]++;
}
else if(i==9 && (j>0 && j<9))
{
if(board[i-1][j-1]) MineCnt[i][j]++;
if(board[i-1][j]) MineCnt[i][j]++;
if(board[i-1][j+1]) MineCnt[i][j]++;
if(board[i][j-1]) MineCnt[i][j]++;
if(board[i][j+1]) MineCnt[i][j]++;
}
else if((i>0 && i<9) && j==0)
{
if(board[i-1][j]) MineCnt[i][j]++;
if(board[i-1][j+1]) MineCnt[i][j]++;
if(board[i][j+1]) MineCnt[i][j]++;
if(board[i+1][j]) MineCnt[i][j]++;
if(board[i+1][j+1]) MineCnt[i][j]++;
}
else if((i>0 && i<9) && j==9)
{
if(board[i-1][j-1]) MineCnt[i][j]++;
if(board[i-1][j]) MineCnt[i][j]++;
if(board[i][j-1]) MineCnt[i][j]++;
if(board[i+1][j-1]) MineCnt[i][j]++;
if(board[i+1][j]) MineCnt[i][j]++;

else
{
if(board[i-1][j-1]) MineCnt[i][j]++;
if(board[i-1][j]) MineCnt[i][j]++;
if(board[i-1][j+1]) MineCnt[i][j]++;
if(board[i][j-1]) MineCnt[i][j]++;
if(board[i][j+1]) MineCnt[i][j]++;
if(board[i+1][j-1]) MineCnt[i][j]++;
if(board[i+1][j]) MineCnt[i][j]++;
if(board[i+1][j+1]) MineCnt[i][j]++;
}
}


while(true)
{
//게임판을 출력한다.
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
cout << setw(2) << Game[i][j];
cout << endl;
}
//지뢰가 없을 곳을 입력한다.
cout << "지뢰의 수는 " << cnt <<"개입니다.\n";
cout << "지뢰가 없을 것 같은\n";
cout << "위치를 입력하시오(행열순) : ";
cin >> r >> c; 

//입력한 위치에 지뢰가 있는 지 체크한다.
if(MineCnt[r][c]==9) 
{
//지뢰를 밟았으니 출력하고 게임은 끝난다.
//지뢰를 출력한다.
Game[r][c]='#';
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
cout << setw(2) << Game[i][j];
cout << endl;
}
break; //작업을 끝낸다. 
}
else
{
//0 또는 숫자의 위치에 숫자문자로 Game배열에 넣고
//출력한다. 
if(MineCnt[r][c]>0)
{
//지정된 위치가 0이 아니면 숫자를 출력하고
//게임을 계속한다. 
Game[r][c]=MineCnt[r][c]+'0';
}
else
{
//0이면 0있는 위치를 기준으로 팔각위치에 0으로 계속 이어졌는지
//체크하여
//숫자가 나올 때까지 계속 체크한다. 
Game[r][c]='.';
chk=0;
i=r; j=c;
while(true)
{
//팔각의 위치에 
//0보다 큰 숫자가 나올 때까지 체크위치를 변경한다.
//r,c의 위행 왼쪽 대각선열 위치 체크 
i--;j--;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 위행 위열 위치 체크 
j++;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 위행 오른쪽 대각선열 위치 체크 
j++;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 r행 c열 오른쪽 열 위치 체크 
i++;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 r행 c열 왼쪽 열 위치 체크 
j-=2;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 r+1행 c열 왼쪽 대각선열 위치 체크 
i++;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 r+1행 c열 아래열 위치 체크 
j++;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}
//r,c의 r+1행 c열 오른쪽 대각선열 위치 체크 
j++;
if((i>=0 && i<=9) && (j>=0 && j<=9))
if(Game[i][j] == '@' && MineCnt[i][j]==0) Game[i][j]='.';
else if(Game[i][j] == '@' && MineCnt[i][j]==9);
else if(Game[i][j] == '@' && (MineCnt[i][j]>0 && MineCnt[i][j]<9))
{
Game[i][j]=MineCnt[i][j]+'0';
chk=1;
}

if(chk) break;

}
}
}
}

cout << "수고하셨습니다.\n";
return 0;
}

 

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 여름

 

반응형

댓글