개발자 톡
연습문제 톡
[HSAT 1회 정기 코딩 인증평가 기출] 안전운전을 도와줄 차세대 지능형 교통시스템
C++ 반례 부탁드립니다.
- 등록일
- 2024-07-28 18:01:45
- 조회수
- 243
- 작성자
- coconut
#include <algorithm> #include <cstdio> #include <cmath> #include <iostream> #include <queue> #include <utility> #include <vector> using namespace std; #define PER_INTERSECTION_SIGNALS 4 #define SIG_TYPES 12 #define MAX_SIGS 4 typedef pair<int, int> position; const position NO_SIG = { 0, 0 }; const position LEFT = { -1, 0 }; const position UP = { 0, -1 }; const position RIGHT = { 1, 0 }; const position DOWN = { 0, 1 }; const position SIG_DIRS[MAX_SIGS] = { RIGHT, UP, LEFT, DOWN }; const position SIGS[SIG_TYPES][MAX_SIGS] = { { NO_SIG, RIGHT, UP, DOWN }, { NO_SIG, LEFT, RIGHT, UP }, { NO_SIG, LEFT, UP, DOWN }, { NO_SIG, LEFT, RIGHT, DOWN }, { NO_SIG, NO_SIG, RIGHT, UP }, { NO_SIG, NO_SIG, LEFT, UP }, { NO_SIG, NO_SIG, LEFT, DOWN }, { NO_SIG, NO_SIG, RIGHT, DOWN }, { NO_SIG, NO_SIG, RIGHT, DOWN }, { NO_SIG, NO_SIG, RIGHT, UP }, { NO_SIG, NO_SIG, LEFT, UP }, { NO_SIG, NO_SIG, LEFT, DOWN } }; int map_size, simulation_time; vector<vector<bool>> visited; vector<vector<int>> sig_seqs; bool is_valid_position(position target) { if(target.first < 0 || target.second < 0 || target.first >= map_size || target.second >= map_size) return false; return !visited[target.first][target.second]; } int simulate() { int passed_intersections = 0; queue<pair<pair<position, position>, int>> positions; positions.push({{ { 0, 1 }, UP }, 0}); while(!positions.empty()) { auto ongoing = positions.front(); positions.pop(); auto current = ongoing.first.first; auto offset = ongoing.first.second; int t = ongoing.second; pair<int, int> next = { current.first + offset.first, current.second + offset.second }; if(!is_valid_position(next)) continue; visited[next.first][next.second] = true; ++passed_intersections; if(t + 1 > simulation_time) continue; int sig_seq_idx = next.second * map_size + next.first; int current_sig = sig_seqs[sig_seq_idx][t % PER_INTERSECTION_SIGNALS] - 1; auto next_dir = SIG_DIRS[current_sig % PER_INTERSECTION_SIGNALS]; if(offset != next_dir) continue; for(const auto& sig: SIGS[current_sig]) { if(sig == NO_SIG) continue; position new_next = { next.first + sig.first, next.second + sig.second }; if(!is_valid_position(new_next)) continue; positions.push({{ next, sig }, t + 1}); } } return passed_intersections; } int main(int argc, char** argv) { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> map_size >> simulation_time; visited.resize(map_size, vector<bool>(map_size)); for(int i = 0; i < map_size * map_size; ++i) { sig_seqs.push_back(vector<int>(PER_INTERSECTION_SIGNALS)); for(int j = 0; j < PER_INTERSECTION_SIGNALS; ++j) cin >> sig_seqs[i][j]; } cout << simulate(); return 0; }
Subtask 1은 정답인데 2에서 절반 가량이 오답으로 나옵니다. 참고할 만한 반례가 있을까요?
#[HSAT_1회_정기_코딩_인증평가_기출]_안전운전을_도와줄_차세대_지능형_교통시스템