计算 NSArray 中的反转
Counting inversions in NSArray
我是 Objective-C 的新手,所以我正在尝试通过实施算法来学习。我正在进行 A* 搜索以解决 8 拼图问题。在 运行 算法本身之前,我想检查给定的拼图组合是否可解。我以前用 C++ 和 Swift 编写过此代码,但对我来说它在 Objective-C 中无法正常工作。对于这个数组,它给出的反转计数为 7,而它应该为 0。也许我应该使用 [NSArray objectAtIndex:] 方法来访问元素,然后将它们转换为整数进行比较?我已经测试了不同的方法并且比较工作正常。请帮我找出错误。
NSArray *test = @[@1, @2, @3, @4, @5, @6, @7, @0, @8];
NSInteger inv_count = 0;
for (NSInteger i = 0; i < 8; i++) {
for (NSInteger j = i + 1; j < 9; j++) {
if (test[j] && test[i] && test[i] > test[j]) {
inv_count++;
}
}
}
NSLog(@"inv_count = %ld", (long)inv_count);
if (inv_count % 2 == 0) {
NSLog(@"Solvable.");
} else {
NSLog(@"Not solvable.");
}
基本上这行代码是错误的:
if(test[j] && test[i] && test[i]>test[j])
test 是 NSNumber
个实例的数组,或者基本上它包含指针。因此,要检查该数组的元素是否等于零或比较它,您应该获得该元素的整数值:
if(((NSNumber*)test[j]).integerValue && ((NSNumber*)test[i]).integerValue && ((NSNumber*)test[i]).integerValue > ((NSNumber*)test[j]).integerValue)
或者您可以使用 NSNumber
的 - (NSComparisonResult)compare:(NSNumber *)aNumber
方法
PS:请检查this for more info。
我是 Objective-C 的新手,所以我正在尝试通过实施算法来学习。我正在进行 A* 搜索以解决 8 拼图问题。在 运行 算法本身之前,我想检查给定的拼图组合是否可解。我以前用 C++ 和 Swift 编写过此代码,但对我来说它在 Objective-C 中无法正常工作。对于这个数组,它给出的反转计数为 7,而它应该为 0。也许我应该使用 [NSArray objectAtIndex:] 方法来访问元素,然后将它们转换为整数进行比较?我已经测试了不同的方法并且比较工作正常。请帮我找出错误。
NSArray *test = @[@1, @2, @3, @4, @5, @6, @7, @0, @8];
NSInteger inv_count = 0;
for (NSInteger i = 0; i < 8; i++) {
for (NSInteger j = i + 1; j < 9; j++) {
if (test[j] && test[i] && test[i] > test[j]) {
inv_count++;
}
}
}
NSLog(@"inv_count = %ld", (long)inv_count);
if (inv_count % 2 == 0) {
NSLog(@"Solvable.");
} else {
NSLog(@"Not solvable.");
}
基本上这行代码是错误的:
if(test[j] && test[i] && test[i]>test[j])
test 是 NSNumber
个实例的数组,或者基本上它包含指针。因此,要检查该数组的元素是否等于零或比较它,您应该获得该元素的整数值:
if(((NSNumber*)test[j]).integerValue && ((NSNumber*)test[i]).integerValue && ((NSNumber*)test[i]).integerValue > ((NSNumber*)test[j]).integerValue)
或者您可以使用 NSNumber
- (NSComparisonResult)compare:(NSNumber *)aNumber
方法
PS:请检查this for more info。