IOS 개발 - 극장 좌석 선택 알고리즘 제한 좌석 발생
10040 단어 ios 개발
또한 일부 극장 의 좌석 배 치 는 규칙 적 인 것 이 아니 라 일부 좌석 은 통로 나 특수 좌석 에 의 해 분리 되 어 서로 다른 구역 이 생 겼 다. 여기 서 좌석 이 외 로 운 좌석 으로 변 했 는 지 확인 할 수 있다.
외 로 운 자리 의 의 미 는 쉽게 말 하면 두 커 플 이 붙 어 있 으 면 안 된다 는 거 예요.
하지만 특별한 경우 도 있 습 니 다. 그리고 구역 이 나 뉘 어 져 있 기 때문에 한 줄 에 연 결 된 좌석 이 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]) ;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IOS 개발 포스트 방식으로 서버 데이터 가져오기텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.