c一段代码...八皇后问题中的...
发布网友
发布时间:2022-04-26 04:50
我来回答
共1个回答
热心网友
时间:2022-04-26 06:19
这个函数的作用是通过递归按顺序设置x所指数组的元素值,k记录当前的数组长度。
执行过程分析,当k=1时,即第一次调用solve1函数,由于j<k-1总是假,内部的for循环一次也没有
被执行,所以f=0,因此会暂时停止进一步执行外部for循环,全局数组a下标0的位置被设置为1。之后将x
和k值加1作为参数递归调用自身,x+1意味着再次进入solve1函数时a数组下标1位置的值会被设置,k+1
意味着数组中将会存入额外的一个元素。
第二次调用solve1函数时,k=2,x=&a[1],由于k-1=1,i的每一个值都会导致内部的for循环被执行一次,
因为a[0]==1,f被置为1,所以i等于1时的值不会存放在a[1]中。当i=2时,内部的第二个if判断为真,
i的值不会被存在a[1]中,继续执行外部的下一次for循环。此时i=3,内部的两个if为假,i的值
会被存放在a[1]中,暂时挂起外部for循环,继续调用自身。
第三次执行solve1函数时, k=3, x=&a[2], 由于k-1=2,i的每一个值都会执行内部的循环两次,
由于i=1、2、3,4时满足内部的if条件,会执行外部for的下一次循环,当i=5时,内部if不成立,
i的值会被存放在a[2]中。。。其实递归调用的执行过程只可意会不可言传。
总体上来说,solve1函数让a全局数组的每个元素通过一定的规则从1-8这8个数中选取合适的值。
如果懂得运用,这样的递归算法可以产生任何字母数字任意长度的排列,所以说非常有用,理解不了也
应该背下来。
可以把solve1函数分解成这样。
#include <stdio.h>
#include <math.h>
int a[8];
void main()
{
int i, j, k, l, m, n, o, p, x, y = 1, f, LOOP;
int *current = a;
for (i = 1; i < 9; ++i)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == i) f=1;
if (abs(a[x] - i) == y - x - 1) f=1;
}
if (f) continue;
*current++ = i;
y++;
for (j = 1; j < 9; ++j)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == j) f=1;
if (abs(a[x] - j) == y - x - 1) f=1;
}
if (f) continue;
*current++ = j;
y++;
for (k = 1; k < 9; ++k)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == k) f=1;
if (abs(a[x] - k) == y - x - 1) f=1;
}
if (f) continue;
*current++ = k;
y++;
for (l = 1; l < 9; ++l)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == l) f=1;
if (abs(a[x] - l) == y - x - 1) f=1;
}
if (f) continue;
*current++ = l;
y++;
for (m = 1; m < 9; ++m)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == m) f=1;
if (abs(a[x] - m) == y - x - 1) f=1;
}
if (f) continue;
*current++ = m;
y++;
for (n = 1; n < 9; ++n)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == n) f=1;
if (abs(a[x] - n) == y - x - 1) f=1;
}
if (f) continue;
*current++ = n;
y++;
for (o = 1; o < 9; ++o)
{
f=0;
for (x=0;x<y-1;x++)
{
if (a[x] == o) f=1;
if (abs(a[x] - o) == y - x - 1) f=1;
}
if (f) continue;
*current++ = o;
y++;
for (p = 1; p < 9; ++p)
{
f=0;
for (x = 0; x < y-1; x++)
{
if (a[x] == p) f=1;
if (abs(a[x] - p) == y - x - 1) f=1;
}
if (f) continue;
*current = p;
for (LOOP = 0; LOOP < 8; ++LOOP)
printf("%d ", a[LOOP]);
putchar('\n');
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
current--;
}
}