众所周知目前影院选座是不允许随便选的,我们不可以任性的挑三拣四,最后留下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判断两个座位是否被过道隔开

  1. -(BOOL)verifySelectedSeatsWithSeatsDic:(NSDictionary *)seatsDic {
  2. NSArray *seatBtns = [seatsDic allValues];
  3. if ([seatBtns count] > ) {
  4. for (WCSeatButton *btn in seatBtns) {
  5. //查看可选座位是否落单
  6. if([btn isSeatAvailable]){
  7. int idx = btn.seatIndex;
  8.  
  9. WCSeatButton *preBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx - ]];
  10. WCSeatButton *nextBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx + ]];
  11.  
  12. //检验是否存在相邻座位 and 可用
  13. BOOL isPreOK = preBtn != nil &&
  14. [preBtn.serviceSeat.row isEqualToString:btn.serviceSeat.row] &&
  15. [preBtn isSeatAvailable];
  16. BOOL isNextOK = nextBtn != nil &&
  17. [nextBtn.serviceSeat.row isEqualToString:btn.serviceSeat.row]&&
  18. [nextBtn isSeatAvailable] ;
  19.  
  20. //再判断同一分区
  21. if (isPreOK) {
  22. isPreOK = ABS([btn.serviceSeat.yCoord intValue] - [preBtn.serviceSeat.yCoord intValue]) == ;
  23.  
  24. }
  25. if (isNextOK) {
  26. isNextOK = ABS([btn.serviceSeat.yCoord intValue] - [nextBtn.serviceSeat.yCoord intValue]) == ;
  27.  
  28. }
  29.  
  30. if (!isPreOK && !isNextOK) {
  31. NSArray *nearBySeats = [self getNearBySeatsInSameRowForSeat:btn withSeatsDic:seatsDic];
  32. //例外 两个座位只选一个
  33. if ([nearBySeats count] == ) {
  34. continue;
  35. }
  36. //例外 3个座位中2个连续被选,剩下单个座位
  37. if ([nearBySeats count] == ) {
  38. int idx = [nearBySeats indexOfObject:btn];
  39. //空座位如果在两边说明中间的座位已经被选,则只要还有一个被选就可以
  40. if (idx == && ![nearBySeats[] isSeatAvailable]) {
  41. continue;
  42. }else if(idx == && ![nearBySeats[] isSeatAvailable]) {
  43. continue;
  44. }
  45. }
  46.  
  47. //只限制当前用户选择的座位,防止其他渠道产生孤座导致当前用户不能选座
  48. for (WC630ServiceSeat *s in self.orderItem.seats) {
  49. if((preBtn && [[[preBtn serviceSeat] cineSeatId] isEqualToString:s.cineSeatId]) ||
  50. (nextBtn && [[[nextBtn serviceSeat] cineSeatId] isEqualToString:s.cineSeatId]) ) {
  51. return NO;
  52. }
  53. }
  54. }
  55.  
  56. }
  57. }
  58. }
  59.  
  60. return YES;
  61. }
  62.  
  63. -(NSArray *)getNearBySeatsInSameRowForSeat:(WCSeatButton *)seat withSeatsDic:(NSDictionary *)seatsDic{
  64. NSMutableArray *result = [NSMutableArray array];
  65. [result addObject:seat];
  66.  
  67. int idx = seat.seatIndex - ;
  68. //left
  69. WCSeatButton *tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];
  70. while([self isSeat:tmp nearBySeatWithoutRoad:seat]){
  71. [result insertObject:tmp atIndex:];
  72. idx--;
  73. tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];
  74. }
  75.  
  76. idx = seat.seatIndex + ;
  77. //right
  78. tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];
  79. while([self isSeat:tmp nearBySeatWithoutRoad:seat]){
  80. [result addObject:tmp];
  81. idx++;
  82. tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]];
  83. }
  84.  
  85. return result;
  86. }
  87.  
  88. -(BOOL)isSeat:(WCSeatButton *)s1 nearBySeatWithoutRoad:(WCSeatButton *)s2{
  89.  
  90. return s1 != nil &&
  91. [s1.serviceSeat.row isEqualToString:s2.serviceSeat.row] &&
  92. ABS([s1.serviceSeat.yCoord intValue] - [s2.serviceSeat.yCoord intValue]) == ABS([s1.serviceSeat.column intValue] - [s2.serviceSeat.column intValue]) ;
  93. }

IOS开发-影院选座算法 限制产生孤座的更多相关文章

  1. iOS开发——UI篇&九宫格算法

    九宫格算法 关于iOS开发中九宫格的实现虽然使用不多,而且后面会有更好的方实现,但是作为一个程序员必需要知道的就是九宫格算法的实现. 一:实现思路: (1)明确每一块用得是什么view (2)明确每个 ...

  2. ios开发——常用经典算法OC篇&冒泡/快速

    冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...

  3. [转]iOS开发中的火星坐标系及各种坐标系转换算法

     iOS开发中的火星坐标系及各种坐标系转换算法 源:https://my.oschina.net/u/2607703/blog/619183   其原理是这样的:保密局开发了一个系统,能将实际的坐标转 ...

  4. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

  5. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  6. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  7. 【转】iOS 开发怎么入门?

    原文网址:http://www.zhihu.com/question/20264108 iOS 开发怎么入门? 请问有设计模式.内存管理方面的资料吗?最好有除了官方文档之外的其它内容,10 条评论 分 ...

  8. iOS开发系列——内购、GameCenter、iCloud、Passbook系统服务开发汇总

    社交 Social 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.空间等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实 ...

  9. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

随机推荐

  1. 使用 IDEA + Maven + Git 快速开发 JAVA或者Web 应用(转)

    0-0 前言 最近和同事做爬虫,其中我主要遇到的问题是:同事在github上放了爬虫demo让我自己去下载,然后自己能搭好环境让整个项目跑起来去抓51job找工作数据.git上克隆一个项目下来,项目是 ...

  2. POJ 3041 -- 二分图匹配

    题意:有个N*N的网格,有一部分格子里有陨石,小明有很牛逼的武器,打一枪后一行或一列的陨石就没了,给出陨石分布,求最小打炮数. 分析:其实就是Konig定理.记最小打炮数为m,在网格里你最多可以找出M ...

  3. (转) Xcode 7 Bitcode

    Xcode 7 Bitcode的工作流程及安全性评估 2015-12-18 06:13 编辑: suiling 分类:iOS开发 来源:FreeBuf黑客与极客 简介 随着 Xcode 7 的发布,苹 ...

  4. SELF, self in CORE DATA

    Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...

  5. 问题:https与http有什么区别啊?

    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议  它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息.它使用安全套接字 ...

  6. 利用BeanUtils在对象间复制属性

    commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很 ...

  7. ubuntu随笔

    在命令行里输入 sudo nautilus 之后输入你的用户的密码,会弹出一个目录窗口来,可以复制到这来

  8. SQL Server 2008安装过程中的一些问题和心得

    开博客已经好久了,但一直没有用起来,也有很多"老人"劝诫我,好记性不如烂笔头,于是一年后的我重拾博客,打算记录一些我在计算机方面遇到的一些问题和心得. 前几天重装了Win10系统, ...

  9. theano中的scan用法

    scan函数是theano中的循环函数,相当于for loop.在读别人的代码时第一次看到,有点迷糊,不知道输入.输出怎么定义,网上也很少有example,大多数都是相互转载同一篇.所以,还是要看官方 ...

  10. nodejs--模块

    在客户端可以将所有的javascript代码分割成几个JS文件,然后在浏览器中将这些JS文件合并.但是在nodejs中是通过以模块为单位来划分所有功能的.每一个模块为一个JS文件,每一个模块中定义的全 ...