先给出结果:
代码思路:
对元素为1-9的数组进行位置交换,递归求出全排列,对每一个排列结果检查是否存在题目提出的关系,存在则输出结果。
代码实现如下:
#include
#include
#define N 9
uint8_t arrayRaw[N];
uint16_t num1 = 0, num2 = 0, num3 = 0;
uint32_t index = 0;
void print();
void perm(int); /*求数组的全排列 */
void swap(int, int);
void print(void)
{
uint16_t i;
printf("[%d]", index);
for (i = 0; i < N; ++i)
{
printf(" %d ", arrayRaw[i]);
}
printf("\n");
}
void trible_check(void)
{
num1 = arrayRaw[0] * 100 + arrayRaw[1] * 10 + arrayRaw[2];
num2 = arrayRaw[3] * 100 + arrayRaw[4] * 10 + arrayRaw[5];
num3 = arrayRaw[6] * 100 + arrayRaw[7] * 10 + arrayRaw[8];
if ( (num1*2 == num2) && (num1*3 == num3) )
{
print();
printf("num1=%d\r\n", num1);
printf("num2=%d\r\n", num2);
printf("num3=%d\r\n", num3);
}
}
void swap(int i, int offset)
{
int temp;
temp = arrayRaw[offset];
arrayRaw[offset] = arrayRaw[i];
arrayRaw[i] = temp;
}
void perm(int offset)
{
uint16_t i;
if (offset == N - 1) // BaseCase
{
index++;
// print();
trible_check();
return;
}
else
{
for (i = offset; i < N; ++i)
{
swap(i, offset);//交换前缀
perm(offset + 1);//递归
swap(i, offset);//将前缀换回来,继续做前一次排列
}
}
}
int main()
{
uint16_t i;
for (i = 0; i < N; ++i)
{
arrayRaw[i] = i + 1;
}
perm(0);
printf("index=%d\r\n", index);
return 0;
}
题意是如此我就这样写了,最基础的语句,
是不是第二个是第一个的2倍,第三个是第一个的3倍
#include
void dfs(int step,int a[10],int book[10]);
int main()
{
int a[11],book[10]={0};
printf("0");
dfs(0,a+1,book);
system("pause");
return 0;
}
void dfs(int step,int a[10],int book[10])
{
int i;
if(step>=10)
{
if(2*(a[0]*100+a[1]*10+a[2])==(a[3]*100+a[4]*10+a[5])&&3*(a[0]*100+a[1]*10+a[2])==(a[6]*100+a[7]*10+a[8]))
printf("%d,%d,%d\n",a[0]*100+a[1]*10+a[2],a[3]*100+a[4]*10+a[5],a[6]*100+a[7]*10+a[8]);
return;
}
for(i=0;i<10;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1,a,book);
book[i]=0;
}
}
return;
}
192 384 576
219 438 657
273 546 819
327 654 981
只有这几个数。