IOS 개발 - 극장 좌석 선택 알고리즘 제한 좌석 발생

10040 단어 ios 개발
알다 시 피 현재 극장 의 좌석 선택 은 마음대로 선택 할 수 없다. 우 리 는 제멋대로 이것저것 고 르 고 마지막 에 N 개의 단독 좌석 을 남 겨 서 는 안 된다. 그 목적 은 적어도 2 개의 연 결 된 좌석 을 남 겨 두 는 것 이다.
또한 일부 극장 의 좌석 배 치 는 규칙 적 인 것 이 아니 라 일부 좌석 은 통로 나 특수 좌석 에 의 해 분리 되 어 서로 다른 구역 이 생 겼 다. 여기 서 좌석 이 외 로 운 좌석 으로 변 했 는 지 확인 할 수 있다.
외 로 운 자리 의 의 미 는 쉽게 말 하면 두 커 플 이 붙 어 있 으 면 안 된다 는 거 예요.
하지만 특별한 경우 도 있 습 니 다. 그리고 구역 이 나 뉘 어 져 있 기 때문에 한 줄 에 연 결 된 좌석 이 2 개 밖 에 없 거나 3 개 밖 에 없 을 때 그 중 하 나 를 살 수 있 습 니 다. 또는 2 개 를 살 수 있 습 니 다.
자, 조건 이 끝 난 후에 데이터 구 조 를 소개 하기 시작 합 니 다. 정상 적 인 상황 에서 극장 의 모든 좌석 데 이 터 는 좌표, 좌석 번호, 예 를 들 어 x, y, row, column 을 포함 합 니 다.
그 중에서 영화관 의 면적 은 한 좌석 의 크기 로 M * N 의 좌표계 로 나 뉘 는데 복도 에 도 좌표 가 있다.row 와 column 이 야 말로 진정한 자리 입 니 다.
한참 동안 수 다 를 떨 었 는데 아래 에 코드 가 있 습 니 다.
입구 함 수 는 verify Selected Seats With Seats Dic,
  1. 매개 변수 seatsDic 는 사전 입 니 다. 이 사전 은 좌석 이 아 닌 데 이 터 를 걸 러 냈 습 니 다!(사전 은 본 프로젝트 에 필요 한 것 입 니 다. array 를 직접 사용 할 수 있 습 니 다. 방법 에서 저도 array 를 얻 었 습 니 다. 좌석 데이터 의 순 서 는 반드시 질서 가 있어 야 한 좌석 의 좌우 좌석 을 얻 을 수 있 습 니 다)
2. 각 좌석 의 데 이 터 를 WCSeattButton 으로 봉 하고 isSeatAvailable 방법 으로 이 좌석 이 구 매 될 수 있 는 지 여 부 를 판단 합 니 다 (판매 되 지 않 음).
3. 함수 getNearby Seats InSameRow ForSeat 는 통로 등 좌석 이 아 닌 모든 좌석 을 가 져 옵 니 다.
    4. 함수 (BOOL) isSeat: (WCSeat Button *) s1 nearby Seat Without Road: (WCSeat Button *) s2 는 두 좌석 이 통로 로 분리 되 었 는 지 판단 합 니 다.
-(BOOL)verifySelectedSeatsWithSeatsDic:(NSDictionary *)seatsDic {

    NSArray *seatBtns = [seatsDic allValues];

    if ([seatBtns count] > 0) {

        for (WCSeatButton *btn in seatBtns) {

            //          

            if([btn isSeatAvailable]){

                int idx = btn.seatIndex;



                WCSeatButton *preBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx - 1]];

                WCSeatButton *nextBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx + 1]];



                //           and   

                BOOL isPreOK = preBtn != nil &&

                        [preBtn.serviceSeat.row isEqualToString:btn.serviceSeat.row] &&

                        [preBtn isSeatAvailable];

                BOOL isNextOK = nextBtn != nil &&

                        [nextBtn.serviceSeat.row isEqualToString:btn.serviceSeat.row]&&

                        [nextBtn isSeatAvailable] ;



                //       

                if (isPreOK) {

                    isPreOK =  ABS([btn.serviceSeat.yCoord intValue] - [preBtn.serviceSeat.yCoord intValue]) == 1;



                }

                if (isNextOK) {

                    isNextOK = ABS([btn.serviceSeat.yCoord intValue] - [nextBtn.serviceSeat.yCoord intValue]) == 1;



                }



                if (!isPreOK && !isNextOK) {

                    NSArray *nearBySeats = [self getNearBySeatsInSameRowForSeat:btn withSeatsDic:seatsDic];

                    //           

                    if ([nearBySeats count] == 2) {

                        continue;

                    }

                    //   3    2     ,      

                    if ([nearBySeats count] == 3) {

                        int idx = [nearBySeats indexOfObject:btn];

                        //

                        if (idx == 0 && ![nearBySeats[2] isSeatAvailable]) {

                            continue;

                        }else if(idx == 2 && ![nearBySeats[0] isSeatAvailable]) {

                            continue;

                        }

                    }



                    //

                    for (WC630ServiceSeat *s in self.orderItem.seats) {

                         if((preBtn && [[[preBtn serviceSeat] cineSeatId] isEqualToString:s.cineSeatId]) ||

                                 (nextBtn && [[[nextBtn serviceSeat] cineSeatId] isEqualToString:s.cineSeatId])    ) {

                             return NO;

                         }

                    }

                }





            }

        }

    }



    return YES;

}



-(NSArray *)getNearBySeatsInSameRowForSeat:(WCSeatButton *)seat withSeatsDic:(NSDictionary *)seatsDic{

    NSMutableArray *result = [NSMutableArray array];

    [result addObject:seat];



    int idx = seat.seatIndex - 1;

    //left

    WCSeatButton *tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];

    while([self isSeat:tmp nearBySeatWithoutRoad:seat]){

        [result insertObject:tmp atIndex:0];

        idx--;

        tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];

    }



    idx = seat.seatIndex + 1;

    //right

    tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];

    while([self isSeat:tmp nearBySeatWithoutRoad:seat]){

        [result addObject:tmp];

        idx++;

        tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];

    }





    return result;

}



-(BOOL)isSeat:(WCSeatButton *)s1 nearBySeatWithoutRoad:(WCSeatButton *)s2{



    return     s1 != nil &&

            [s1.serviceSeat.row isEqualToString:s2.serviceSeat.row] &&

            ABS([s1.serviceSeat.yCoord intValue] - [s2.serviceSeat.yCoord intValue]) == ABS([s1.serviceSeat.column intValue] - [s2.serviceSeat.column intValue]) ;

}

좋은 웹페이지 즐겨찾기