iSharp
https://www.acmicpc.net/problem/14503
<문제>
<코드>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int n, m, r, c, d, dir = 0; //0123 북동남서
int map[51][51];
int visit[51][51]; // 청소안한곳 0, 벽이면 -1
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int solve(int a, int b, int cnt, int dir)
{
if (visit[a][b] == 0)
{
visit[a][b] = cnt;
cnt++;
}
/*
if (cnt == 60)
{
cout << a << b << dir;
return cnt;
}*/
if ((visit[a - 1][b] == -1 || visit[a - 1][b] > 0) && (visit[a + 1][b] == -1 || visit[a + 1][b] > 0) && (visit[a][b - 1] == -1 || visit[a][b - 1] > 0) && (visit[a][b + 1] == -1 || visit[a][b + 1] > 0))
{
// 뒤쪽이 벽이라 후진도 못해서 종료
if (visit[a + dx[(dir+2)%4]][b + dy[(dir+2)%4]] == -1)
{
//cout << a << ' ' << b << ' ' << dir << ' ';
return cnt;
}
// 뒤쪽이 벽이 아니라 후진
else
{
a += dx[(dir+2)%4];
b += dy[(dir+2)%4];
return solve(a, b, cnt, dir);
}
}
for (int i = 0; i < 4; i++)
{
dir = (dir + 3) % 4;
// 왼쪽방향 청소 안했으면
if (visit[a+dx[dir]][b+dy[dir]] == 0)
{
a += dx[dir];
b += dy[dir];
return solve(a, b, cnt, dir);
break;
}
// 왼쪽방향 벽이거나 청소했으면
else
{
continue;
}
}
//cout << "ASDfasfdasfD";
}
void printMap()
{
cout << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%3d", visit[i][j]);
}
cout << endl;
}
}
int main()
{
//cout << "Qwerqwer";
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
cin >> r >> c >> d;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> map[i][j];
if (map[i][j] == 1)
visit[i][j] = -1;
}
}
int ans = solve(r, c, 1, d);
//printMap();
cout << ans-1;
}
'Algorithm > 시뮬레이션' 카테고리의 다른 글
[백준][15685번][시뮬레이션] 드래곤 커브 (1) | 2019.05.08 |
---|---|
[백준][3568번][시뮬레이션] iSharp (0) | 2019.05.04 |