Programming/Baekjoon

백준 14226 이모티콘 [c++]

fishersheep 2022. 2. 9. 16:39
반응형
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>

using namespace std;

int s;
bool visited[1001][1001];	//방문을표시할 배열

typedef struct
{
	int n;	//화면에 존재하는 이모티콘 수
	int c;	//클립보드의 이모티콘 수
	int t;	//연산시간
}emt;	//queue에 사용될 구조체

void bfs()	//bfs함수
{
	queue<emt>q;	//queue 선언
	q.push({ 1,0,0 });	//이미화면에 1이 입력되어있기에 1,0,0을 push
	visited[1][0] = true;	//방문표시

	while (!q.empty())
	{
		int x = q.front().n;	//queue의 front 값 저장
		int y = q.front().c;
		int z = q.front().t;
		q.pop();	//저장한 값 queue에서 삭제


		if (x == s)	//x==s 일 경우
		{
			cout << z;	//출력후 종료
			return;
		}

		visited[x][y] = true;	//방문표시
		
		if (x < 1001 && x>0 )	//x가 0보다 크고 최대값 보다 작은경우
		{	
			if (visited[x][x] != true)	//방문여부 확인
			{
				q.push({ x,x,z + 1 });	//화면에 있는 이모티콘을 클립보드에 복사
				visited[x][x] = true;	//방문표시
			}
		}
		
		if (x < 1001 && x>0 && x + y < 1001)	//x가 0보다 크고 최대값 보다 작으며, x+y가 최대값보다 작은경우
		{
			if (visited[x + y][y] != true)	//방문여부 확인
			{
				q.push({ x + y,y,z + 1 });	//클립보드에 있는 이모티콘을 화면에 붙여넣기
				visited[x+y][x] = true;	//방문표시

			}
		}
		
		if (x - 1 > 0 || x > s)	//x에서 1을 뺀 값이 0보다 크거나 x가 0보다 큰경우
		{
			if (visited[x - 1][y] != true)	//방문확인
			{
				q.push({ x - 1,y,z + 1 });	//화면에 있는 이모티콘 하나 삭제
				visited[x -1][y] = true;	//방문표시
			}
		}
		
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> s;	//s입력
	bfs();	//bfs

	return 0;
}
반응형

'Programming > Baekjoon' 카테고리의 다른 글

백준 15651 N과M(3) [c++]  (0) 2022.02.15
백준 15650 N과 M [c++]  (0) 2022.02.14
백준 17086 아기상어2 [c++]  (0) 2022.02.09
백준 9613 GCD합 [c++]  (0) 2022.02.08
백준 13913 숨바꼭질 4 [c++]  (0) 2022.02.07