【iOS算法】三条线上4个数字之和相等的算法

最近碰到这样一道算法题:

a--i 为 1--9 的数字,且不重复,求a--i为何值时,三条线上的四个数字之和相等,

即 a+b+c+d = d+e+f+g = g+h+i+a


【iOS算法】三条线上4个数字之和相等的算法_第1张图片

最初思路:
1、a -- i ,是1--9的数字,且不能重复,其实第一个数字是 C9取1,第二个数字是 C8取1,第三个数字为 C7取1 ... 即最终能够组合成 A9取9 ,即 362880 组数据。

2、362880 组数据中,找出符合  a+b+c+d = d+e+f+g = g+h+i+a ,即为结果数据

3、dataAry 存储每组的这 9 个数字,usedAry 存储已经使用的数字。


实践:

/**
 获取符合条件的数

 @param index 当前数的位置
 @param count 总数
 */
- (void)dealDataWithIndex:(NSInteger)index count:(NSInteger)count{
    if (!usedAry) {
        usedAry = [NSMutableArray arrayWithCapacity:count];
        dataAry = [NSMutableArray arrayWithCapacity:count];
        resultCount = 0;//符合要求的总数
        totalCount = 0;//总数
    }

    if (index == count) {
        totalCount ++;
        if ([self sumDidEqual]) {
            resultCount++;
            NSLog(@"\nresultCount = %@,\n data = \n%@",@(resultCount),dataAry);

        }
        return;
    }

    for (int i=0; i

其中,判断当前9个数是否符合要求的算法为:

- (BOOL)sumDidEqual{
    NSInteger sum0 = 0,sum1 = 0,sum2 = 0;
    for (int i=0; i<=3; i++) {
        sum0 += [dataAry[i] integerValue];
    }
    for (int i=3; i<=6; i++) {
        sum1 += [dataAry[i] integerValue];
    }
    for (int i=6; i


在视图里调用:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self dealDataWithIndex:0 count:9];
}

结果:
由于数据量比较大,运行时,会花一定时间。

结果如下,总组数符合预测,符合条件的一共有 864 组数据:

totalCount = 362880;//总组数

resultCount = 864; // 符合条件的组数


ps:后来无意中发现,这里有对此题的C++算法实现。分析了下,思路差不多,唯一的区别就是,他重复数组里存储的是 BOOL 值来记录当前值是否已经被使用。以下,是我按照他的思路更改的代码,最终结果都是一样的。

/**
 获取符合条件的数

 @param index 当前数的位置
 @param count 总数
 */
- (void)dealDataWithIndex:(NSInteger)index count:(NSInteger)count{
    if (!usedAry) {
        usedAry = [NSMutableArray arrayWithCapacity:count];
        dataAry = [NSMutableArray arrayWithCapacity:count];
        resultCount = 0;//符合要求的总数
        totalCount = 0;//总数

        //初始存储
        for (int j=0; j






你可能感兴趣的:(iOS-算法)