회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
1
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
어디부분 구현이 잘못됐는지 알 수 있을까요??
17837번 - 새로운 게임 2
gudrkrsla
4년 전
0
문제 예시나 간단한 예제들은 잘 나오는 것 같은데, 마지막 예제에서 걸려서요..
#include<iostream> #include<vector> using namespace std; typedef struct Node { int y, x, dir; }Node; int N, K; int y, x, Dir; //우좌상하 int dx[5] = { 0,1,-1,0,0 }; int dy[5] = { 0,0,0,-1,1 }; int Map[14][14]; int tmp; bool flag = true; vector<int>Mmap[13][13]; //말들의 위치 정보를 담는다. vector<Node>input; int Change(int dir) { //방향전환 if (dir == 1)return 2; if (dir == 2)return 1; if (dir == 3)return 4; if (dir == 4)return 3; } void renew() { //모든칸을 확인한 뒤, 말이 있으면 해당 index의 말의 좌표를 다시 넣어준다 for (int y = 1; y <= N; y++) { for (int x = 1; x <= N; x++) { if (Mmap[y][x].size() == 0)continue; for (int z = 0; z < Mmap[y][x].size(); z++) { int index = Mmap[y][x][z]; input[index].x = x; input[index].y = y; } } } } bool move(int index) { //현재위치 int px = input[index].x; int py = input[index].y; //다음위치 int nx = input[index].x; int ny = input[index].y; int dir = input[index].dir; //현재있는 곳에 있는 말들의 수 int p_size = Mmap[py][px].size(); int p_Loca = 0; int n_Loca; //현재 있는곳에서 자신의 위치를 파악한다. for (int i = 0; i < p_size; i++){ if (Mmap[py][px][i] == index){ p_Loca = i; break; } } //방향대로 한칸 전진 nx += dx[dir]; ny += dy[dir]; //파란색일 경우, 방향바꿔 전진하고, 또다시 파랑이면 방향만 저장하고 종료 if (Map[ny][nx] == 2) { dir = Change(dir); nx = px + dx[dir]; ny = py + dy[dir]; if (Map[ny][nx]==2) { input[index].dir = dir; return false; } } //이동시에 이전 칸에서 빼내야 하는 말들의 갯수 tmp = p_size - p_Loca; switch (Map[ny][nx]){ case 0: //자기 위치부터 끝까지, 순서대로 다음 칸에 넣은 후 그만큼, 이전 칸에서 pop for (int i = p_Loca; i < p_size; i++) Mmap[ny][nx].push_back(Mmap[py][px][i]); while (tmp--) Mmap[py][px].pop_back(); break; case 1: //위와 순서만 바꿔서 넣은후, 이전 칸에서 pop for (int i = p_size - 1; i >= p_Loca; i--) Mmap[ny][nx].push_back(Mmap[py][px][i]); while (tmp--) Mmap[py][px].pop_back(); break; } //말들의 좌표를 갱신해준다 renew(); //이동한 칸에서 말들의 갯수가 4이상이면 true, 아니면 false return n_Loca = Mmap[ny][nx].size(); if (n_Loca >= 4)return true; else return false; } int main() { cin >> N >> K; for (int y = 1; y <= N; y++) for (int x = 1; x <= N; x++) cin >> Map[y][x]; //벽에 부딪히는 경우는 파란색으로 처리 for (int y = 0; y <= N + 1; y++) { Map[y][0] = 2; Map[y][N + 1] = 2; } for (int x = 0; x <= N + 1; x++) { Map[0][x] = 2; Map[N + 1][x] = 2; } //말들의 정보 받기 for (int i = 0; i < K; i++) { cin >> y >> x >> Dir; input.push_back({ y,x,Dir }); Mmap[y][x].push_back(i); } int Turn = 0; //움직여서 Turn이 1000이 넘으면 -1, 그렇지 않으면 Turn을 출력한 후 종료 while (flag) { flag = true; for (int i = 0; i < K; i++) if (move(i)) { flag = false; break; } Turn++; if (Turn > 1000)break; } if (Turn > 1000) cout << "-1"; else cout << Turn; return 0; }
댓글을 작성하려면
로그인
해야 합니다.
gudrkrsla 4년 전
문제 예시나 간단한 예제들은 잘 나오는 것 같은데, 마지막 예제에서 걸려서요..