일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- off by one
- 포맷스트링버그
- heap
- House of Orange
- RTL
- 브루트 포스
- 이진트리
- DFS
- BFS
- 스위핑 알고리즘
- 백트래킹
- tcache
- 다이나믹 프로그래밍
- 연결리스트
- OOB
- 큐
- 동적 계획법
- 에라토스테네스의 체
- 수학
- 완전 탐색
- fsb
- 분할 정복
- 문자열 처리
- BOF
- 이분 탐색
- 이진 탐색
- ROP
- 스택
- 투 포인터
- syscall
Archives
- Today
- Total
SDJ( 수돈재 아님 ㅎ )
[C++] 17267 - 상남자 본문
문제 링크 : 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