SDJ( 수돈재 아님 ㅎ )

[C++] 17267 - 상남자 본문

알고리즘/Backjoon

[C++] 17267 - 상남자

ShinDongJun 2020. 7. 1. 00:20

문제 링크 : https://www.acmicpc.net/problem/17267

 

17267번: 상남자

CTP의 대표 상남자 영조는 자유롭게 이동하는 것을 좋아한다. 그렇지만 영조는 상남자이기 때문에 위아래로만 간다. 따라서 위, 아래로는 얼마든지 이동할 수 있지만 왼쪽, 오른쪽으로는 이동하

www.acmicpc.net

 

 

 

#include<bits/stdc++.h>
#define endl '\n';

using namespace std;

typedef struct Point
{
	int x, y;
	int L, R;	
}P;

bool visited[1005][1005];
int N, M;
int L, R;
int y, x;

int BFS()
{
	int res = 0;
	int i;

	P p;
	
	queue< P > Q;
	Q.push({x, y, L, R});

	visited[y][x] = 1;
	res+=1;

	while(!Q.empty())
	{
		p = Q.front(); Q.pop();

		//up
		i = 1;
		while(0 <= p.y-i && visited[p.y-i][p.x] == 0)
		{
			Q.push({p.x, p.y-i, p.L, p.R});
			visited[p.y-i][p.x] = 1;
			res+=1;
			i+=1;
		}

		//down
		i = 1;
		while(p.y+i < N && visited[p.y+i][p.x] == 0)
		{
			Q.push({p.x, p.y+i, p.L, p.R});
			visited[p.y+i][p.x] = 1;
			res += 1;
			i+=1;
		}

		//left
		if(0 < p.x && visited[p.y][p.x-1] == 0 && p.L)
		{
			Q.push({p.x-1, p.y ,p.L-1, p.R});
			visited[p.y][p.x-1] = 1;
			res+=1;
		}

		//right
		if(p.x < M-1 && visited[p.y][p.x+1] == 0 && p.R)
		{
			Q.push({p.x+1, p.y, p.L, p.R-1});
			visited[p.y][p.x+1] = 1;
			res+=1;
		}
	}

	return res;
}

int main(void)
{
	int tmp;
	scanf("%d %d", &N, &M);
	scanf("%d %d", &L, &R);

	for(int i = 0; i < N; ++i)
		for(int j = 0; j < M; ++j)
		{
			scanf("%1d", &tmp);
			if(tmp == 2)
			{
				y = i; x = j;
				visited[i][j] = 0;
			}
			else
				visited[i][j] = tmp;
		}

	cout << BFS() << endl;

	return 0;
}

'알고리즘 > Backjoon' 카테고리의 다른 글

[Java] 8911 - 거북이  (0) 2020.07.01
[C++] 1013 - Contact  (0) 2020.06.30
[C] 1021 - 회전하는 큐  (0) 2020.06.30
[C++] 12904 - A와 B  (0) 2020.06.30
[C++] 1806 - 부분합  (0) 2020.02.01
Comments