드래곤커브_15685

ddo_h·2020년 5월 16일
0
post-thumbnail

문제 출처 : 드래곤커브_15685

파라미터 정리

격자 크기 100x100이며, 유효한 좌표 범위: 0 ≤ x ≤ 100, 0 ≤ y ≤ 100
=>Map[101][101]로 둬야함
N 드래곤 커브의 개수 (1~20)
드래곤 커브 속성 3가지{
y, x 시작점 (0~100), x : col, y : row
d 시작 방향 (0 →, 1 ↑, 2 ←, 3 ↓)
g 세대 (0~10)
}
드래곤 커브는 격자 밖으로 벗어나지 않음
드래곤 커브는 서로 겹칠 수 있음
원하는 것 : 세대 수 만큼 드래곤 커브를 90도 시계방향 회전 시켜 이어붙인 후 크기가 1x1인 정사각형의 네 꼭짓점이 모두 드래곤 커브의 일부인 것의 개수를 구하기

간략한 과정

input_1 N 입력받기
input_2 드래곤 커브 정보 (x, y, d, g) N번 입력받기->벡터 사용하기
for문을 이용해서 초기 벡터 만큼 루프 돌리기{
d만큼 드래곤 커브를 그린다
vector total, vector temp를 이용해서 원래 벡터의 값 tt->tp로 복사함
tp의 값을 뒤에서부터 순차적으로 d+1해서 tt에 이어그려줌
}
모든 초기 벡터에 대해 드래곤 커브를 그린 후 꼭짓점 개수를 구하는 함수 호출
row, col -> row,col+1 -> row+1,col+1 -> row+1, col 이 모두 true 인지 확인하고
맞으면 cnt++;
output 1x1인 정사각형의 네 꼭짓점을 이루는 개수 cnt 반환

코드

시행착오

백업_0528_pm5, 방향구할때 4 안나눠준거 빼고 다 구현, 근데 x,y 바뀐거 지금 깨달음

위에서 말한 문제 모두 고침
예제 3 빼고 모두 정상적으로 동작함
예제 3에서는 세대가 0인데 이때 runtime 에러가 발생함 ->어디 로직에 갇힌듯

예제는 모두 충족하지만 결과는 틀렸다고 나옴

문제 통과함, 위에 문제는 꼭짓점 계산할 때 i,j 허용값을 100까지 해둬서 생긴 문제
i,j를 99까지만 허용했더니 수정됨 (i,j = 100,100이면 반대편 꼭짓점은 101,101이 되기 때문에 문제가 발생함)

#include <iostream>
#include <vector>

using namespace std;
struct DragonCv{
  int r, c, d, g;  
};
int N;
int Dr[4] = {0,-1,0,1};
int Dc[4] = {1,0,-1,0};
bool Map[101][101] = {false};
vector<DragonCv> dcv_init;

void draw_dcv(DragonCv dcv){
    int nr = dcv.r, nc = dcv.c;
    int cnt = dcv.g;
    vector<int> total_d(1,dcv.d);
    
    while(cnt!=0){
    	vector<int> temp_d(total_d);
        for(int i = temp_d.size() -1; i >= 0; i--){
        	int temp = temp_d[i];
            total_d.push_back((temp+1)%4);
        }
        --cnt;
    }
    
    Map[nr][nc] = true;
    for(int i = 0; i < total_d.size(); i++){
        int dir = total_d[i];
        nr += Dr[dir];
        nc += Dc[dir];
        if(nr < 0 || nc < 0|| nr > 100 || nc > 100) break;
        Map[nr][nc] = true;
    }
    
    return;
}

int solve(){
    int res = 0;
    
    //초기 입력값에 대해 드래곤 커브 그리기
    for(int i = 0; i < dcv_init.size(); i++){
        draw_dcv(dcv_init[i]);
    }
    //꼭짓점 계산 부분
    for(int i = 0; i < 100; i++){
        for(int j = 0; j < 100; j++){
            if(Map[i][j] && Map[i+1][j] && Map[i+1][j+1] && Map[i][j+1])
                res++;
        }
    }
    
    return res;
}

int main()
{
    
    cin >> N;
    for(int i = 0; i < N; i++){
        int x,y,d,g;
        cin >> x >> y >> d >> g;
        dcv_init.push_back({y,x,d,g});
    }
    
    cout << solve() << endl;
    return 0;
}
profile
열심히!

0개의 댓글