ThinkerUnion
幼苗
共回答了20个问题采纳率:90% 举报
输出1-9的全排列,对每一项输入进行这个两倍/三倍关系的验证如果符合就输出即可。以下经过测试#include
#include
#include
#include
struct Node
{
int r[9];
struct Node *next;
} head = {{0}, NULL}, *current = head;
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
void arrange(int m, int n, int *data)
{
//out put a full arrange
if(m == n)
{
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
memcpy(node->r, data, 9 * sizeof(int));
current->next = node;
current = node;
}
else
{
for(int i=m; i<=n; i++)
{
swap(&data[m], data[i]);
arrange(m+1, n, data);
swap(&data[m], data[i]);
}
}
}
int main()
{
int data[9] = {1,2,3,4,5,6,7,8,9};
arrange(0, 8, data);
struct Node *p;
for(p = head.next; p; p=p->next)
{
/*for(int i=0; i<9; i++)
{
printf("%d ", p->r[i]);
}
printf("");*/
int i = p->r[0] * 100 + p->r[1] * 10 + p->r[2];
int j = p->r[3] * 100 + p->r[4] * 10 + p->r[5];
int k = p->r[6] * 100 + p->r[7] * 10 + p->r[8];
if((j == 2 * i) (k == 3 * i))
{
printf("%d %d %d", p->r[0], p->r[1], p->r[2]);
printf("%d %d %d", p->r[3], p->r[4], p->r[5]);
printf("%d %d %d", p->r[6], p->r[7], p->r[8]);
printf("==========================");
}
}
return 0;
}
输出共四组:
1 9 2
3 8 4
5 7 6
==========================
2 1 9
4 3 8
6 5 7
==========================
2 7 3
5 4 6
8 1 9
==========================
3 2 7
6 5 4
9 8 1
==========================
1年前
5