巧妙填数 枚举法(求C代码)将1~9这九个数字填入九个空格中。每一横行的三个数字组成一个三位数。如果要使第二行的三位数是

巧妙填数 枚举法(求C代码)
将1~9这九个数字填入九个空格中。每一横行的三个数字组成一个三位数。如果要使第二行的三位数是第一行的两倍, 第三行的三位数是第一行的三倍, 应怎样填数。如图6:
1 9 2
3 8 4
5 7 6
梦无牵 1年前 已收到1个回答 举报

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
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 16 q. 0.597 s. - webmaster@yulucn.com