话不多说,上代码
int f(int* p)
{
char t = 0;
for (int i = 0; i < 5; i++)
t |= 1 << p[i];
return t == 0x3E;
}//查重函数
void rec(int* p, int n)
{
if (n >= 5)
{
if ((p[1] == 2) + (p[0] == 3) == 1 &&
(p[1] == 2) + (p[4] == 4) == 1 &&
(p[2] == 1) + (p[3] == 2) == 1 &&
(p[2] == 5) + (p[3] == 3) == 1 &&
(p[4] == 4) + (p[0] == 1) == 1 &&
f(p))
{
for (int i = 0; i < 5; i++)
printf("%d ", p[i]);
putchar('\n');
}
return;
}
else
{
for (p[n] = 1; p[n] <= 5; p[n]++)
rec(p, n + 1);
}
}
int main()
{
int p[5];
rec(p, 0);
return 0;
}
😇
若i为0 1 2 3 4 则执行else语句
i对应元素赋值1,传i+1,在i<5情况下,i+1对应元素赋值1
此部分过后,数组p每个元素赋值1,此时n为4,传参5
执行if语句,若不满足
p[4]由1逐增到5,当p[4]已达到最大值5仍没有满足,for循环结束,返回上次rec
即p[3]由1->2,n为3,传参4,p[4]赋值1,此时n为4,传参5
执行if语句,若不满足
p[4]由1逐增到5,当p[4]已达到最大值5仍没有满足,for循环结束,返回上次rec
即p[3]由2->3,n为3,传参4,p[4]赋值1,此时n为4,传参5
// ....
//若满足说明p已赋值成功,打印后逐次返回rec,函数结束