문제
URL : https://codeup.kr/problemsetsol.php?psid=23
소스코드
/*
문제 : 성실한 개미
[input]
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 1 2 0 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
[output]
1 1 1 1 1 1 1 1 1 1
1 9 9 1 0 0 0 0 0 1
1 0 9 1 1 1 0 0 0 1
1 0 9 9 9 9 9 1 0 1
1 0 0 0 0 0 9 1 0 1
1 0 0 0 0 1 9 9 9 1
1 0 0 0 0 1 2 0 9 1
1 0 0 0 0 1 0 0 9 1
1 0 0 0 0 0 0 0 9 1
1 1 1 1 1 1 1 1 1 1
[설명]
10 * 10 크기의 미로 상자의 구조와 먹이의 위치가 입력되면
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
개미집은 반드시 (2, 2)에서 시작된다.
개미는 먹이(2)를 찾았거나, 더 이상 움직일 수 없을 때까지 오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 표시되어 주어질 때, 똑똑한 개미의 이동 경로를 예상해보자.
단, 가장 아래의 가장 오른쪽에 도착한 경우나, 더 이상 움직일 수 없는 경우,
또는 먹이를 찾은 경우에는 그 곳에 머무른다고 가정한다.
미로의 테두리는 모두 벽으로 되어있다.
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int a[10][10], failCount = 0;
srand((unsigned int)time(NULL));
// 개미굴 입력
for (int i = 0; i < 10; i++) {
for (int k = 0; k < 10; k++) {
cin >> a[i][k];
}
}
int start_x = 1;
int start_y = 1;
a[start_x][start_y] = 9;
while (true)
{
// 오른쪽과 아래 둘 다 갈 수 있을 경우만 난수생성
if (!(a[start_x + 1][start_y] == 1) && !(a[start_x][start_y + 1] == 1)) {
if (rand() % 2 == 0) // 랜덤으로 0이 나오면 아래로
{
if (a[start_x][start_y + 1] == 2) { // 보물인 경우
cout << "보물을 찾았습니다." << endl;
break;
}
else {
a[start_x + 1][start_y] = 9;
start_x++;
}
}
else // 1이 나오면 오른쪽으로
{
if (a[start_x + 1][start_y] == 2) { // 보물인 경우
cout << "보물을 찾았습니다." << endl;
break;
}
else {
a[start_x][start_y + 1] = 9;
start_y++;
}
}
}
// 오른쪽만 갈 수 있으면 오른쪽으로 이동
else if (!(a[start_x + 1][start_y] == 1)) {
a[start_x + 1][start_y] = 9;
start_x++;
}
// 아래쪽만 갈 수 있으면 아래쪽으로 이동
else if (!(a[start_x][start_y + 1] == 1)) {
a[start_x][start_y + 1] = 9;
start_y++;
}
// 둘 다 갈 수 없으면
else {
cout << "더 이상 이동할 수 없습니다." << endl;
break;
}
}
// 개미굴 출력
for (int i = 0; i < 10; i++) {
for (int k = 0; k < 10; k++) {
cout << a[i][k] << " ";
}
cout << endl;
}
return 0;
}