본문 바로가기

Algorithm

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

반응형

출처

https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

BFS로 구현해서 풀었다. => 제한시간이 촉박하다 느끼는 경우 BFS , 메모리가 부족하다 생각되는 경우 DFS

각 파이프 마다 사방의 위치에서 이어질 수 있는 파이프들에 대한 조건을 각각 지정.

예를 들면 1번 파이프의 왼쪽에는 3,4,5,6번 파이프가 연결되지 않으면 이동 불가.

이동이 가능한 경우 카운트를 올려주고 이동한 지점에 대해서는 visit처리를 해줌. 한 지역에 머무름 방지 ( 시간초과 발생)

그리고 time값을 매개변수로 계속 전달하여 이동한 시간이 탈주범에게 주어진 시간과 같아지는 경우에 break시킴

count는 그전에 올려주기 때문에 상관 없음.

 

 

 

 

#include<iostream>
#include<queue>

using namespace std;

int arr[50][50];
bool visit[50][50];
int count = 0;

struct Node{
	
	
	int R;
	int C;
	int time;
};



int main(void)
{
	int test_case;
	cin >> test_case;
	
	
	for(int tc = 1; tc <= test_case; tc++)
	{
		int N,M,R,C,L;
		
		cin >> N >> M >> R >> C >>L;
		
		queue<Node> que;
		count = 0;
		
		
		for(int i = 0; i < N; i++)
		{
			for(int j = 0; j < M; j++)
			{
				
				cin >> arr[i][j];
				visit[i][j] = false;
			}
			
		}
		
		que.push({R,C,1});
		visit[R][C] = true;
		count++;
		
		while(!que.empty())
		{
			int y = que.front().R;
			int x = que.front().C;
			int time = que.front().time;
			que.pop();
			
			
			if(time == L)
			break;
			
			int hole = arr[y][x];
			
			if(hole == 1)
			{
				if(y>=0 && y<N && x-1>=0 && x-1<M)
				{
					if(!visit[y][x-1] )
					{
						if((arr[y][x-1] == 3) || (arr[y][x-1] == 4) || (arr[y][x-1] == 5) || (arr[y][x-1] == 1))
						{
							visit[y][x-1] = true;
							count++;
							que.push({y,x-1,time+1});
							
							
						}
					}
				}
				
				if(y>=0 && y<N && x+1>=0 && x+1<M)
				{
					if(!visit[y][x+1] )
					{
						if((arr[y][x+1] == 3) || (arr[y][x+1] == 6) || (arr[y][x+1] == 7) || (arr[y][x+1] == 1))
						{
							visit[y][x+1] = true;
							count++;
							que.push({y,x+1,time+1});
							
							
						}
					}
				}
				
				if(y-1>=0 && y-1<N && x>=0 && x<M)
				{
					if(!visit[y-1][x] )
					{
						if((arr[y-1][x] == 2) || (arr[y-1][x] == 5) || (arr[y-1][x] == 6) || (arr[y-1][x] == 1))
						{
							visit[y-1][x] = true;
							count++;
							que.push({y-1,x,time+1});
							
							
						}
					}
				}
				
				if(y+1>=0 && y+1<N && x>=0 && x<M)
				{
					if(!visit[y+1][x] )
					{
						if((arr[y+1][x] == 2) || (arr[y+1][x] == 4) || (arr[y+1][x] == 7) || (arr[y+1][x] == 1))
						{
							visit[y+1][x] = true;
							count++;
							que.push({y+1,x,time+1});
							
							
						}
					}
				}
				
			
			}
			else if(hole == 2)
			{
				
				if(y-1>=0 && y-1<N && x>=0 && x<M)
				{
					if(!visit[y-1][x] )
					{
						if((arr[y-1][x] == 2) || (arr[y-1][x] == 5) || (arr[y-1][x] == 6) || (arr[y-1][x] == 1))
						{
							visit[y-1][x] = true;
							count++;
							que.push({y-1,x,time+1});
							
							
						}
					}
				}
				
				if(y+1>=0 && y+1<N && x>=0 && x<M)
				{
					if(!visit[y+1][x] )
					{
						if((arr[y+1][x] == 2) || (arr[y+1][x] == 4) || (arr[y+1][x] == 7) || (arr[y+1][x] == 1))
						{
							visit[y+1][x] = true;
							count++;
							que.push({y+1,x,time+1});
							
							
						}
					}
				}
				
			}
			else if(hole == 3)
			{
				
				if(y>=0 && y<N && x-1>=0 && x-1<M)
				{
					if(!visit[y][x-1] )
					{
						if((arr[y][x-1] == 3) || (arr[y][x-1] == 4) || (arr[y][x-1] == 5) || (arr[y][x-1] == 1))
						{
							visit[y][x-1] = true;
							count++;
							que.push({y,x-1,time+1});
							
							
						}
					}
				}
				
				if(y>=0 && y<N && x+1>=0 && x+1<M)
				{
					if(!visit[y][x+1] )
					{
						if((arr[y][x+1] == 3) || (arr[y][x+1] == 6) || (arr[y][x+1] == 7) || (arr[y][x+1] == 1))
						{
							visit[y][x+1] = true;
							count++;
							que.push({y,x+1,time+1});
							
							
						}
					}
				}
				
			}
			else if(hole == 4)
			{
				
				if(y>=0 && y<N && x+1>=0 && x+1<M)
				{
					if(!visit[y][x+1] )
					{
						if((arr[y][x+1] == 3) || (arr[y][x+1] == 6) || (arr[y][x+1] == 7) || (arr[y][x+1] == 1))
						{
							visit[y][x+1] = true;
							count++;
							que.push({y,x+1,time+1});
							
							
						}
					}
				}
				
				
				if(y-1>=0 && y-1<N && x>=0 && x<M)
				{
					if(!visit[y-1][x] )
					{
						if((arr[y-1][x] == 2) || (arr[y-1][x] == 5) || (arr[y-1][x] == 6) || (arr[y-1][x] == 1))
						{
							visit[y-1][x] = true;
							count++;
							que.push({y-1,x,time+1});
							
							
						}
					}
				}
				
			}
			else if(hole == 5)
			{
					
				if(y>=0 && y<N && x+1>=0 && x+1<M)
				{
					if(!visit[y][x+1] )
					{
						if((arr[y][x+1] == 3) || (arr[y][x+1] == 6) || (arr[y][x+1] == 7) || (arr[y][x+1] == 1))
						{
							visit[y][x+1] = true;
							count++;
							que.push({y,x+1,time+1});
							
							
						}
					}
				}
				
				
				if(y+1>=0 && y+1<N && x>=0 && x<M)
				{
					if(!visit[y+1][x] )
					{
						if((arr[y+1][x] == 2) || (arr[y+1][x] == 4) || (arr[y+1][x] == 7) || (arr[y+1][x] == 1))
						{
							visit[y+1][x] = true;
							count++;
							que.push({y+1,x,time+1});
							
							
						}
					}
				}
				
				
				
				
			}
			else if(hole == 6)
			{
				
				
				if(y+1>=0 && y+1<N && x>=0 && x<M)
				{
					if(!visit[y+1][x] )
					{
						if((arr[y+1][x] == 2) || (arr[y+1][x] == 4) || (arr[y+1][x] == 7) || (arr[y+1][x] == 1))
						{
							visit[y+1][x] = true;
							count++;
							que.push({y+1,x,time+1});
							
							
						}
					}
				}
				
				if(y>=0 && y<N && x-1>=0 && x-1<M)
				{
					if(!visit[y][x-1] )
					{
						if((arr[y][x-1] == 3) || (arr[y][x-1] == 4) || (arr[y][x-1] == 5) || (arr[y][x-1] == 1))
						{
							visit[y][x-1] = true;
							count++;
							que.push({y,x-1,time+1});
							
							
						}
					}
				}
				
				
			}
			else if(hole == 7)
			{
				
				if(y>=0 && y<N && x-1>=0 && x-1<M)
				{
					if(!visit[y][x-1] )
					{
						if((arr[y][x-1] == 3) || (arr[y][x-1] == 4) || (arr[y][x-1] == 5) || (arr[y][x-1] == 1))
						{
							visit[y][x-1] = true;
							count++;
							que.push({y,x-1,time+1});
							
							
						}
					}
				}
				if(y-1>=0 && y-1<N && x>=0 && x<M)
				{
					if(!visit[y-1][x] )
					{
						if((arr[y-1][x] == 2) || (arr[y-1][x] == 5) || (arr[y-1][x] == 6) || (arr[y-1][x] == 1))
						{
							visit[y-1][x] = true;
							count++;
							que.push({y-1,x,time+1});
							
							
						}
					}
				}
				
				
				
			}
			
	
			
		}
		
			cout <<"#"<<tc<<" "<<count<<endl;
	}
	
	
}
반응형