AMUSEMENTPARK 질문

  • swg0110
    swg0110

    아래코드로 실행을 해 봤는데 오답이 발생합니다. 오답을 찾아보려고 했으나 저는 암만 봐도 찾을 수가 없어서 질문을 올립니다.ㅠㅠ
    주석은 다 달아놨으니 혹시 코드에러를 찾아 주실 분 있으시면 정말 감사하겠습니다. 감사합니다

    #include <iostream>
    #include <string.h>
    #include <math.h>
    
    using namespace std;
    
    int mark[20];
    int ridxlist[400];
    int cidxlist[400];
    int rstposlist[400];
    
    bool is_visible(int minrow, int mincol, int maxrow, int maxcol);
    
    int main() {
        int rownum, colnum, initpos;
        cin >> rownum >> colnum >> initpos;
        memset(mark, 0, sizeof(mark));
        int poscnt = 0;
    
        for (int i = 0; i < rownum; i++) {
            for (int j = 0; j < colnum; j++) {
                int curid = 0;
                cin >> curid;
                if (curid == 0)
                    continue;
    
                // ridxlist, cidxlist 에 position들의 row idx, colume idx 를 저장 
                int idx = curid - 1;
                ridxlist[idx] = i;
                cidxlist[idx] = j;
    
                // row 별로 position 존재여부를 integer array에 bit manipulation 으로 저장
                mark[i] |= (1L << j); 
    
                // poscnt에 valid 한 position의 개수를 저장합니다.
                poscnt = max(curid, poscnt);
            }
        }
        int midx = initpos - 1;
        int diff = initpos - 1;
        int rstcnt = 0;
        while (midx < poscnt) {
            int oridx = ridxlist[midx - diff];
            int ocidx = cidxlist[midx - diff];
            int mridx = ridxlist[midx];
            int mcidx = cidxlist[midx];
            if (is_visible(min(mridx, oridx), min(mcidx, ocidx), max(mridx, oridx), max(mcidx, ocidx))) {
                rstposlist[rstcnt] = midx - diff + 1;
                rstcnt++;
            }
            midx++;
        }
        cout << rstcnt << endl;
        int rstidx = 0;
        while (rstidx < rstcnt) {
            cout << rstposlist[rstidx] << endl;
            rstidx++;
        }
        return 0;
    }
    
    // 입력으로 주어진 영역에 장애물이 있는지 검사합니다. (없으면 true, 있으면 false)
    bool is_visible(int minrow, int mincol, int maxrow, int maxcol) {
        // row나 column둘 중 하나라도 idx차이가 1일 경우에는 장애물이 없다는 뜻으로 true를 return 
        if (((maxrow - minrow) == 1) || ((maxcol - mincol) == 1))
            return true;
    
        // row나 column idx 차이가 0이면 그 라인을 아닐경우 그 사이에 있는 라인들을 검사하도록 minrow, maxrow etc 를 수정
        int rdiff = ((maxrow - minrow) == 0)? 0 : 1;
        int cdiff = ((maxcol - mincol) == 0)? 0 : 1;
        minrow += rdiff;
        mincol += cdiff;
        maxrow -= rdiff;
        maxcol -= cdiff;
    
        int rowidx = minrow;
        unsigned int rstflag = 0;
        unsigned int mask = (~((unsigned int)(-1) << (maxcol - mincol + 1))) << mincol; // 검사하고 싶은 column 영역에만 bit가 켜지도록 mask변수를 설정
        while (rowidx <= maxrow) {
            rstflag |= mask & mark[rowidx];
            rowidx++;
        }
        return (rstflag == 0);
    }
    
    --------------
    

    7년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.