봄버맨이 터트리는 로직 제작 (Bomberman(char[,] board)
)
폭탄(O)
이라면 큐에 담는다. 기존 배열과 반대로 새로운 배열에 저장한다..
로 저장한다.필요한 배열은 총 4개다.
1. 최초의 배열
2. 모두 폭탄인 배열
3. 최초의 배열을 터트린 배열
4. 3번을 터트린 배열
순서상 1 2 3 2 4 2 3 2 4 2 3 2 4 2 ... 이렇게 반복이 된다.
즉
출력시
코드를 반복하기 귀찮아 StringBuilderExtension 확장 클래스 제작
using System.Text;
namespace BOJ_16918
{
public static class StringBuilderExtension
{
public static string Append2DArrayToString(char[,] array)
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
stringBuilder.Append(array[i, j]);
}
stringBuilder.AppendLine();
}
return stringBuilder.ToString();
}
}
class Program
{
static void Main()
{
using StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
using StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));
int[] inputs = sr.ReadLine().Split().Select(int.Parse).ToArray();
int R = inputs[0];
int C = inputs[1];
int N = inputs[2];
char[,] board = new char[R, C];
char[,] bombBoard = new char[R, C];
for (int i = 0; i < R; i++)
{
string s = sr.ReadLine();
for (int j = 0; j < C; j++)
{
board[i, j] = s[j];
bombBoard[i, j] = 'O';
}
}
char[,] bomberFirstBoard = Bomberman(R, C, board);
char[,] bomberSecondBoard = Bomberman(R, C, bomberFirstBoard);
// 1일 때 원본
if (N == 1)
{
sw.WriteLine(StringBuilderExtension.Append2DArrayToString(board));
}
// 짝수 일때 전부 폭탄
else if (N % 2 == 0)
{
sw.WriteLine(StringBuilderExtension.Append2DArrayToString(bombBoard));
}
else switch (N % 4)
{
// 3 7 11 15 ...
case 3:
sw.WriteLine(StringBuilderExtension.Append2DArrayToString(bomberFirstBoard));
break;
// 5 9 13 17 ...
case 1:
sw.WriteLine(StringBuilderExtension.Append2DArrayToString(bomberSecondBoard));
break;
}
}
static char[,] Bomberman(int R, int C, char[,] board)
{
Queue<(int, int)> q = new Queue<(int, int)>();
char[,] newBoard = new char[R, C];
int[] dx = { 1, 0, -1, 0 };
int[] dy = { 0, 1, 0, -1 };
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
if (board[i, j] == 'O')
{
q.Enqueue((i, j));
newBoard[i, j] = '.';
}
else
newBoard[i, j] = 'O';
}
}
while (q.Count > 0)
{
(int x, int y) = q.Dequeue();
for (int dir = 0; dir < 4; dir++)
{
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
newBoard[nx, ny] = '.';
}
}
return newBoard;
}
}
}
구현
그래프 이론
그래프 탐색
시뮬레이션