출처] 반크_세계유산 창덕궁
참고풀이]
#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;
}
참고풀이 결과]
대한민국의 아름다운 영토, 독도의 여름
'프로그램 > C++ 1000제' 카테고리의 다른 글
C++ 80제] 어서와 C++는 처음이지! CHAPTER 02 PROGRAMMING EXERCISE 2. (0) | 2022.10.03 |
---|---|
C++ 79제] 어서와 C++는 처음이지! CHAPTER 02 PROGRAMMING EXERCISE 1. (0) | 2022.09.30 |
C++ 77제] 어서와 C++는 처음이지! p110 도전문제 응용. (0) | 2022.09.16 |
C++ 76제] 어서와 C++는 처음이지! p104 도전문제 2. (0) | 2022.09.11 |
C++ 75제] 어서와 C++는 처음이지! p104 도전문제1 (0) | 2022.09.11 |
댓글