반응형
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpLlKAQ4DFAUq
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을 리턴해야합니다.
}
반응형
'Algorithm' 카테고리의 다른 글
sw 1227. [S/W 문제해결 기본] 7일차 - 미로2 (0) | 2020.03.28 |
---|---|
SW 2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2020.03.27 |
1949. [모의 SW 역량테스트] 등산로 조성 (0) | 2020.03.26 |
1224. [S/W 문제해결 기본] 6일차 - 계산기3 (0) | 2020.03.25 |
SW 1211. [S/W 문제해결 기본] 2일차 - Ladder2 (0) | 2020.03.24 |