回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图写一个算法,找到从10x10网格中选择10个值的可能的解决方案。没有两个值可以共享同一行或列。有10个!略高于3600000。在</p>
<p>我的初始算法使用10个嵌套的for循环,并简单地检查10个正方形的每个可能的组合。当我试着在我的MacBook上运行这个应用程序时,它需要很多很多分钟,所以为了缓解无聊,我把每个测试都记录到控制台上,这样我就可以观察到测试结果了。在</p>
<p>问题是应用程序运行到测试号714271,然后冻结。这个结果是可重复的。在</p>
<p>我假设这是一个内存问题,某个地方的计数器超过了它的最大允许值,但当我搜索它时,这个数字没有意义。在</p>
<hr/>
<p>代码如下:</p>
<pre><code>-(IBAction)findSolutions:(id)sender{
NSMutableArray* flags = [[NSMutableArray alloc]initWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], nil];
NSMutableString* solutionsString = [[NSMutableString alloc]init];
int a,b,c,d,e,f,g,h,i,j,z,sum;
for(a=0;a<=9;a++){
for(b=0;b<=9;b++){
for(c=0;c<=9;c++){
for(d=0;d<=9;d++){
for(e=0;e<=9;e++){
for(f=0;f<=9;f++){
for(g=0;g<=9;g++){
for(h=0;h<=9;h++){
for(i=0;i<=9;i++){
for(j=0;j<=9;j++){
for(z=0;z<=9;z++){
[flags replaceObjectAtIndex:z withObject:[NSNumber numberWithInt:0]];
} //Clear the flags matrix
//Load the flags matrix
[flags replaceObjectAtIndex:a withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:b withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:c withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:d withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:e withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:f withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:g withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:h withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:1]];
[flags replaceObjectAtIndex:j withObject:[NSNumber numberWithInt:1]];
sum = 0;
for(z=0;z<=9;z++){
sum = sum + [[flags objectAtIndex:z]intValue];
} // sum the flags matrix. Will = 10 if all columns are filled
if (sum == 10) {
NSLog(@"Test no. %d, sum=%d, a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d, i=%d, j=%d",y,sum,a,b,c,d,e,f,g,h,i,j);
[solutionsString <a href="https://www.cnpython.com/list/append" class="inner-link">append</a>String:[NSString stringWithFormat:@"Test no. %d, sum=%d, a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d, i=%d, j=%d",y,sum,a,b,c,d,e,f,g,h,i,j]];
[txtSolutionsFound setStringValue:solutionsString];
} // These are possible solutions
NSLog(@"a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d, i=%d, j=%d",a,b,c,d,e,f,g,h,i,j);
}
}
}
}
}
}
}
}
}
}
}
</code></pre>
<p>最终更新
我要坦白。我放弃了让代码在obj-c中工作的尝试,而是用Python重写它。它现在已经运行了几个小时,检查了10^10个组合中的12亿个,没有占用系统内存,平均来说比obj-c代码少使用50%的CPU时间。我喜欢Cocoa应用程序的外观,UI的创建也非常出色,但是对于纯粹的可操作性,Python是很难击败的。在</p>
<p>Python代码如下所示:</p>
^{pr2}$