IOS开发-影院选座算法 限制产生孤座
众所周知目前影院选座是不允许随便选的,我们不可以任性的挑三拣四,最后留下N个单独的座位,目的就是要留下至少2个连着的座位;
另外有些影院的座位摆放并不是规则的,有些座位被过道或者特殊座位分割开,产生了不同的分区,这里就实现检测有没有座位变成了孤座,
孤座的含义简单说就是两个小情侣不能挨着坐了~
但是也存在特殊情况,及因为分区的缘故,某一排连着的座位只有2个,或者只有3个,这时候还是可以允许人家买其中之一,或者之二的~
好,条件说完之后,开始介绍数据结构,正常情况下,影院的每一个座位数据会包含坐标,座位号,如x,y,row,column。
其中,影厅中的面积会以单个座位的大小被分割成M*N的坐标系,即过道也有它的坐标;而row和column才是真正的座位;
啰嗦了半天,下面上代码:
入口函数是verifySelectedSeatsWithSeatsDic,
1. 参数seatsDic是一个字典,注意该字典过滤掉了非座位的数据!(字典是本项目所需,你可以直接用一个array,方法中我也是获取了array;注意座位数据的顺序一定是有序的,这样才能获取到一个座位的左右座位)
2. 每个座位的数据我封装成了一个WCSeatButton,并提供了isSeatAvailable方法判断该座位是否可以被购买(未被售出)
3. 函数getNearBySeatsInSameRowForSeat负责获取没有被过道等非座位隔开的所有座位
4. 函数(BOOL)isSeat:(WCSeatButton *)s1 nearBySeatWithoutRoad:(WCSeatButton *)s2判断两个座位是否被过道隔开
-(BOOL)verifySelectedSeatsWithSeatsDic:(NSDictionary *)seatsDic {
NSArray *seatBtns = [seatsDic allValues];
if ([seatBtns count] > ) {
for (WCSeatButton *btn in seatBtns) {
//查看可选座位是否落单
if([btn isSeatAvailable]){
int idx = btn.seatIndex;
WCSeatButton *preBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx - ]];
WCSeatButton *nextBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx + ]];
//检验是否存在相邻座位 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]) == ;
}
if (isNextOK) {
isNextOK = ABS([btn.serviceSeat.yCoord intValue] - [nextBtn.serviceSeat.yCoord intValue]) == ;
}
if (!isPreOK && !isNextOK) {
NSArray *nearBySeats = [self getNearBySeatsInSameRowForSeat:btn withSeatsDic:seatsDic];
//例外 两个座位只选一个
if ([nearBySeats count] == ) {
continue;
}
//例外 3个座位中2个连续被选,剩下单个座位
if ([nearBySeats count] == ) {
int idx = [nearBySeats indexOfObject:btn];
//空座位如果在两边说明中间的座位已经被选,则只要还有一个被选就可以
if (idx == && ![nearBySeats[] isSeatAvailable]) {
continue;
}else if(idx == && ![nearBySeats[] 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 - ;
//left
WCSeatButton *tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];
while([self isSeat:tmp nearBySeatWithoutRoad:seat]){
[result insertObject:tmp atIndex:];
idx--;
tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];
}
idx = seat.seatIndex + ;
//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]) ;
}
IOS开发-影院选座算法 限制产生孤座的更多相关文章
- iOS开发——UI篇&九宫格算法
九宫格算法 关于iOS开发中九宫格的实现虽然使用不多,而且后面会有更好的方实现,但是作为一个程序员必需要知道的就是九宫格算法的实现. 一:实现思路: (1)明确每一块用得是什么view (2)明确每个 ...
- ios开发——常用经典算法OC篇&冒泡/快速
冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...
- [转]iOS开发中的火星坐标系及各种坐标系转换算法
iOS开发中的火星坐标系及各种坐标系转换算法 源:https://my.oschina.net/u/2607703/blog/619183 其原理是这样的:保密局开发了一个系统,能将实际的坐标转 ...
- iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- 【转】iOS 开发怎么入门?
原文网址:http://www.zhihu.com/question/20264108 iOS 开发怎么入门? 请问有设计模式.内存管理方面的资料吗?最好有除了官方文档之外的其它内容,10 条评论 分 ...
- iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总
社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实 ...
- iOS-提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
随机推荐
- ubuntu下修改进入root用户和修改文件权限
(1)进入root用户 su root 密码:设置的root密码 (2)修改文件权限 sudo chmod +777 file (3)执行shell ./shellfile (4)编写shell 第 ...
- 全国大学列表文件(较新)+ nodejs导入mongodb数据库
直接上代码 'use strict' var fs=require('fs'), mongodb=require('mongodb').MongoClient, assert=require('ass ...
- 纠结attr(),prop()
刚刚看博客无意中看到attr()和prop()的区别,回头就去翻了一下手册,感觉手册上写的过于简单,不能很清晰的分辨出两者的区别,两者的参数用法都是高度相似. attr():设置或返回被选元素的属性值 ...
- CentOS 7 网络配置工具
之前在CentOS 6下编辑网卡,直接使用setup工具就可以了. 但在新版的CentOS 7里,setuptool已经没有网络编辑组件了,取而代之的是NetworkManager Text User ...
- linux 下 C语言显示中文
例如:tset.c int main() { printf("你好,世界\n"); retuen 0; } 编译时应该这样: iconv -f gb2312 -t utf8 tes ...
- Apache2 同源策略解决方案 - 配置 CORS
什么是同源策略 现在的浏览器大多配有同源策略(Same-Origin Policy),具体表现如下: 浏览某一网站,例如 http://www.decembercafe.org/.这个网页中的 Aja ...
- 16 On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima 1609.04836v1
Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, Ping Tak Peter Tang N ...
- ion-refresher 下拉更新数据
使用指令ion-refresher可以为容器eg:ion-scroll 和 ion-content进行拉动刷新 <ion-scroll> <ion-refresher on-refr ...
- javascript学习笔记全记录
js的初步了解 1.就是用来修改样式的,修改的是行内样式.任何样式都能够修改. 2.css里面怎么写js就怎么写. 3.任何元素都能加事件:事件都要小写 js的三大 ...
- acm数学(转)
这个东西先放在这吧.做过的以后会用#号标示出来 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能 ...