낚시왕_17143

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

문제 출처 : 낚시왕_17143

파라미터 정리

RxC 전체 격자판 크기 (2~100), row 행, col 열, (R,C)는 마지막 칸 = 행렬 1부터 시작함
1칸에 한 마리 상어 有
M 상어의 수 (0~RxC)
상어 속성 (위치, 속력, 방향, 크기) = (r c, s, d, z)
위치는 1초마다 변함
속도는 이동 방향 + 속력을 가짐, 속력은 부동, 방향은 격자판의 경계를 넘는 경우 반대가 됨
크기는 부동
이동 방향 (d) : 1(위) 2(아래) 3(오른쪽) 4(왼쪽)
낚시 과정
-사람은 오른쪽 열로 1칸씩 이동
-각 위치에서 가장 가까운 상어를 잡는다.
-상어 이동 (한 칸에 두 마리 이상이 되면 크기가 큰 상어만 유지) (같은 크기의 상어는 없음)
원하는 것 = 사람이 낚시를 마친 후 잡은 상어의 크기의 합을 반환

간략한 과정

input_1 R,C,M 입력받기
input_2 상어의 정보(r,c,s,d,z) M번 입력받기
do{
사람 한칸 오른쪽 열로 이동하기
해당 열에서 row 값이 가장 작은 상어 선택하기
상어 삭제 + 상어 크기 결과에 +
상어의 방향과 속력에 맞추어 이동시키고 정보 업데이트
}while(사람이 C+1이 될 때)
output 상어의 크기 반환하기

코드

#include <iostream>
#include <cstring>

using namespace std;

struct shark{
    int s,d,z;
};
int R,C,M;
shark Arr[100][100];
int Dr[4] = {-1,1,0,0};
int Dc[4] = {0,0,1,-1};

int solve(){
    int res = 0;
    shark backup[100][100];
    for(int t = 0; t < C; t++){
        for(int i = 0; i < R; i++){
            if(Arr[i][t].z >0){
                res += Arr[i][t].z;
                Arr[i][t].z = 0;
                break;
            }
        }
        
        memcpy(backup, Arr, sizeof(Arr));
        memset(Arr,0, sizeof(Arr));
        for(int i = 0; i < R; i++){
            for(int  j = 0; j < C; j++){
                shark& curr = backup[i][j];
                if(curr.z > 0){
                    int nr = i + curr.s*Dr[curr.d];
                    int nc = j + curr.s*Dc[curr.d];
                    
                    if(nr < 0){
                        nr *= (-1);
                        curr.d = 1;
                    }else if(nc < 0){
                        nc *= -1;
                        curr.d = 2;
                    }
                    if(nr > R-1){
                        int a = nr/(R-1), b = nr%(R-1);
                        if(a%2 == 0){
                            nr = b;
                        }else{
                            nr = R-1 -b;
                            curr.d = 0;
                        }
                    }else if(nc > C-1){
                        int  a = nc/(C-1), b = nc%(C-1);
                        if(a%2 == 0){
                            nc = b;
                        }else{
                            nc = C-1 -b;
                            curr.d = 3;
                        }
                    }
                    
                    if(Arr[nr][nc].z < curr.z){
                        Arr[nr][nc] = curr;
                    }
                }
            }
        }
        
    }
    
    
    return res;
}

int main()
{
    cin >> R >> C >> M;
    for(int i = 0; i < M; i++){
        int r,c,s,d,z;
        cin >> r >> c >> s >> d >> z;
        Arr[r-1][c-1] = {s,d-1,z};
    }
    
    cout << solve() << endl;

    return 0;
}

시행착오

백업_0530_pm6:00 구현 완료
상어 이동할 때 벡터에 이상한 값이 추가되서 결과값이 이상하게 나옴, 예제 1 수행시 98456460나옴,,,말이안됨
그리고 코드 길이 너무 김

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

#define INF 98456451

struct shark{
    int r,c,s,d,z;
};
int R,C,M;
vector<shark> s_list;
int Dr[4] = {-1,1,0,0};
int Dc[4] = {0,0,1,-1};

void shark_move(){
    
    shark visited[R][C];
    memset(visited, 0, sizeof(visited));
    
    for(int i = 0; i < s_list.size(); i++){
        //int nr = s_list[i].r, nc = s_list[i].c;
        int speed = s_list[i].s, dir = s_list[i].d, size = s_list[i].z;
        
        int nr = s_list[i].r + speed*Dr[dir];
        int nc = s_list[i].c +speed*Dc[dir];
        
        if(nr < 0){//위로 벗어나는 경우
            nr *= -1;
            dir = 1;//아래로 방향 전환
        }else if(nc < 0){//왼쪽으로 벗어나는 경우
            nc *= -1;
            dir = 2;//오른쪽으로 방향 전환
        }
        
        if(nr > R-1){
            int a = nr/(R-1), b = nr%(R-1);
            if(a%2 == 0){//방향 그대로
                nr = b;
            }else{
                nr = (R-1) - b;
                dir = 0;//위로 방향 전환
            }
        }else if(nc > C-1){
            int a = nc/(C-1), b = nc%(C-1);
            if(a%2 == 0){//방향 그대로
                nc = b;
            }else{
                nc = (C-1) - b;
                dir = 3;//왼쪽으로 방향 전환
            }
        }
        
        shark temp = visited[nr][nc];
        if(temp.z != 0 && size < temp.z){//기존의 물고기가 클때
            
        }else{//물고기 없거나 새로운 물고기가 클 때
            visited[nr][nc] = {nr, nc, speed, dir, size};
        }
    }
    
    s_list.clear();
    for(int i = 0; i < R; i++){
        for(int j = 0; j < C; j++){
            if(visited[i][j].z == 0) continue;
            shark temp = visited[i][j];
            s_list.push_back(temp);
        }
    }
    
    return;
}

int solve(){
    int res = 0;
    int W_loc = 0;
    
    do{
        //상어 선택
        int dis = INF, size = INF;
        for(int i = 0; i < s_list.size(); i++){
            int nr = s_list[i].r, nc = s_list[i].c;
            if(nc == W_loc){
                dis = min(dis, nr);
                size = s_list[i].z;
            }
        }
        for(auto iter = s_list.begin(); iter != s_list.end(); ){
            if((*iter).z == size){
                iter = s_list.erase(iter);
                break;
            }else iter++;
        }
        res += dis;
        //상어 이동
        shark_move();
        //열 한칸 옮기기
        W_loc++;
    }while(W_loc<C);//낚시꾼이 범위 벗어날 때
    
    return res;
}

int main()
{
    cin >> R >> C >> M;
    for(int i = 0; i < M; i++){
        int r,c,s,d,z;
        cin >> r >> c >> s >> d >> z;
        s_list.push_back({r-1,c-1,s,d-1,z});
    }
    cout << solve() << endl;

    return 0;
}
profile
열심히!

0개의 댓글