iOS 從allCount個元素中取出myCount個元素的所有排列組合
#import "CombinationModel.h"
@implementation CombinationModel {
NSMutableArray *_usedArr;//識別
NSMutableArray *_resultArr;//結果
NSMutableArray *_needArr;//加入起點
int _allCount;//總數
int _myCount;//需要數
}
//初始化
- (instancetype)init {
self = [superinit];
if (self) {
[self
}
return self;
}
- (void)initData {
_usedArr = [NSMutableArrayarray];
_resultArr = [NSMutableArrayarray];
_needArr = [NSMutableArrayarray];
}
#pragma mark - combination
/*
_allCount 總數, _myCount需要的數
_allCount個元素中取出_myCount個元素的所有排列
dataSource 資料來源
step 初始值 0
*/
- (void
if (step == _allCount) {
//獲取第一組資料
[_needArraddObject:[_resultArrmutableCopy]];
}else {
for (int i=0; i<_myCount; i++) {
if (![_usedArr[i]intValue]) {
//標識為1,表明改元素在當前組合中已排列組合
_usedArr[i] = @(1)
//加入資料
_resultArr[step] = dataSource[i];
//遞迴下一層組合
[self perm:(step+1) dataSource:dataSource];
//一個迴圈後,重新下一次排列組合,重新標識為0
_usedArr[i] = @(0);
}
}
}
}
#pragma mark - setter
- (void)setDataSource:(NSMutableArray *)dataSource {
_dataSource = dataSource;
if (_dataSource.count) {
_allCount =_myCount = (int)_dataSource.count;
//新增識別資料來源
for (int i=0; i<_allCount; i++) {
[_usedArr addObject:@(0)];
}
//呼叫遞迴第0步
[self perm:0dataSource:_dataSource];
if (_needArr.count) {
[self setResultArr:_needArr];
}
}
}
//返回排列組合後的結果
- (void)setResultArr:(NSMutableArray *)resultArr {
_resultArr = resultArr;
}
//加入起點
- (NSMutableArray *)addStartPointWithCoordinate:(NSDictionary *)coor {
if (coor.count &&_resultArr.count) {
NSMutableArray *tempM = [NSMutableArrayarray];
for (NSMutableArray *singleArrin _resultArr) {
[singleArr insertObject:coor atIndex:0];
[tempM addObject:singleArr];
}
return tempM;
}
return nil;
}
//如有錯誤,歡迎指正!