본문 바로가기

Algorithm

SW 1953. [모의 SW 역량테스트] 탈주범 검거

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpLlKAQ4DFAUq

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

 

 

BFSで簡単に解けました。でも、最初は道のタイプってゆうかなそんなことぜんぜん気にしなくてミスしたけど

まあ、、すぐ直しました。

 

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int N, M, R, C, L;
int arr[50][50];
bool visit[50][50];

struct Node {

	int y;
	int x;
	int dir;
	int cur;
};

bool upcheck(int y, int x)
{
	int check = arr[y - 1][x];

	if (check == 1 || check == 2 || check == 5 || check == 6)
	{
		return true;
	}

	return false;
}

bool downcheck(int y, int x)
{
	int check = arr[y + 1][x];

	if (check == 1 || check == 2 || check == 4 || check == 7)
	{
		return true;
	}

	return false;

}

bool leftcheck(int y, int x)
{
	int check = arr[y][x - 1];

	if (check == 3 || check == 4 || check == 5 || check == 1)
	{
		return true;
	}

	return false;
}

bool rightcheck(int y, int x)
{
	int check = arr[y][x + 1];

	if (check == 1 || check == 3 || check == 6 || check == 7)
	{
		return true;
	}

	return false;
}

int main(int argc, char** argv)
{
	int test_case;
	int T;

	cin >> T;
	/*
	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
	*/
	for (test_case = 1; test_case <= T; ++test_case)
	{
		cin >> N >> M >> R >> C >> L;
		memset(visit, 0, sizeof(visit));


		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < M; j++)
			{
				cin >> arr[i][j];
			}
		}
		
		queue<Node> que;
		visit[R][C] = true;
		que.push({ R,C,arr[R][C],1 });
		int result = 1;


		while (!que.empty())
		{
			int y = que.front().y;
			int x = que.front().x;
			int dir = que.front().dir;
			int cur = que.front().cur;

			
			que.pop();


			if (dir == 1)
			{
				if (y - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y - 1][x] && upcheck(y, x))
					{
						visit[y - 1][x] = true;
						que.push({ y - 1,x,arr[y - 1][x],cur + 1 });
						result++;
					}

				}

				if (y + 1 < N)
				{
					if (cur + 1 <= L && !visit[y + 1][x] && downcheck(y, x))
					{
						visit[y + 1][x] = true;
						que.push({ y + 1,x,arr[y + 1][x],cur + 1 });
						result++;
					}

				}

				if (x - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y][x - 1] && leftcheck(y, x))
					{
						visit[y][x - 1] = true;
						que.push({ y ,x - 1 ,arr[y][x - 1],cur + 1 });
						result++;
					}
				}

				if (x + 1 < M)
				{
					if (cur + 1 <= L && !visit[y][x + 1] && rightcheck(y, x))
					{
						visit[y][x + 1] = true;
						que.push({ y ,x + 1 ,arr[y][x + 1],cur + 1 });
						result++;
					}

				}
			}
			else if (dir == 2)
			{
				if (y - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y - 1][x] && upcheck(y, x))
					{
						visit[y - 1][x] = true;
						que.push({ y - 1,x,arr[y - 1][x],cur + 1 });
						result++;
					}

				}

				if (y + 1 < N)
				{
					if (cur + 1 <= L && !visit[y + 1][x] && downcheck(y, x))
					{
						visit[y + 1][x] = true;
						que.push({ y + 1,x,arr[y + 1][x],cur + 1 });
						result++;
					}

				}
			}
			else if (dir == 3)
			{
				if (x - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y][x - 1] && leftcheck(y, x))
					{
						visit[y][x - 1] = true;
						que.push({ y ,x - 1 ,arr[y][x - 1],cur + 1 });
						result++;
					}
				}

				if (x + 1 < M)
				{
					if (cur + 1 <= L && !visit[y][x + 1] && rightcheck(y, x))
					{
						visit[y][x + 1] = true;
						que.push({ y ,x + 1 ,arr[y][x + 1],cur + 1 });
						result++;
					}

				}
			}
			else if (dir == 4)
			{
				if (y - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y - 1][x] && upcheck(y, x))
					{
						visit[y - 1][x] = true;
						que.push({ y - 1,x,arr[y - 1][x],cur + 1 });
						result++;
					}

				}

				if (x + 1 < M)
				{
					if (cur + 1 <= L && !visit[y][x + 1] && rightcheck(y, x))
					{
						visit[y][x + 1] = true;
						que.push({ y ,x + 1 ,arr[y][x + 1],cur + 1 });
						result++;
					}

				}

			}
			else if (dir == 5)
			{

				if (y + 1 < N)
				{
					if (cur + 1 <= L && !visit[y + 1][x] && downcheck(y, x))
					{
						visit[y + 1][x] = true;
						que.push({ y + 1,x,arr[y + 1][x],cur + 1 });
						result++;
					}

				}


				if (x + 1 < M)
				{
					if (cur + 1 <= L && !visit[y][x + 1] && rightcheck(y, x))
					{
						visit[y][x + 1] = true;
						que.push({ y ,x + 1 ,arr[y][x + 1],cur + 1 });
						result++;
					}

				}
			}
			else if (dir == 6)
			{
				if (y + 1 < N)
				{
					if (cur + 1 <= L && !visit[y + 1][x] && downcheck(y, x))
					{
						visit[y + 1][x] = true;
						que.push({ y + 1,x,arr[y + 1][x],cur + 1 });
						result++;
					}

				}


				if (x - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y][x - 1] && leftcheck(y, x))
					{
						visit[y][x - 1] = true;
						que.push({ y ,x - 1 ,arr[y][x - 1],cur + 1 });
						result++;
					}
				}

			}
			else if (dir == 7)
			{
				if (y - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y - 1][x] && upcheck(y, x))
					{
						visit[y - 1][x] = true;
						que.push({ y - 1,x,arr[y - 1][x],cur + 1 });
						result++;
					}

				}


				if (x - 1 >= 0)
				{
					if (cur + 1 <= L && !visit[y][x - 1] && leftcheck(y, x))
					{
						visit[y][x - 1] = true;
						que.push({ y ,x - 1 ,arr[y][x - 1],cur + 1 });
						result++;
					}
				}

			}

		}
		cout << "# " << test_case << " " << result << endl;

	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형