输出1-9的全排列,对每一项输入进行这个两倍/三倍关系的验证
如果符合就输出即可。以下经过测试
#include <stdioh>#include <stringh>
#include <stdlibh>
#include <stdioh>
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 = headnext; p; p=p->next)
{
/for(int i=0; i<9; i++)
{
printf("%d ", p->r[i]);
}
printf("\n");/
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\n", p->r[0], p->r[1], p->r[2]);
printf("%d %d %d\n", p->r[3], p->r[4], p->r[5]);
printf("%d %d %d\n", p->r[6], p->r[7], p->r[8]);
printf("==========================\n");
}
}
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
==========================
在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。
以每周七天为例,我们可以使用 #define 命令来给每天指定一个名字:
#define 命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种 枚举(Enum)类型 ,能够列出所有可能的取值,并给它们取一个名字。
enum 是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途; typeName 是枚举类型的名字; valueName1, valueName2, valueName3, 是每个值对应的名字的列表。注意最后的 ; 不能少。
例如,列出一个星期有几天:
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues Sun 对应的值分别为 0、1 6。
我们也可以给每个名字都指定一个值:
更为简单的方法是只给第一个名字指定值:
这样枚举值就从 1 开始递增,跟上面的写法是等效的。
枚举是一种类型,通过它可以定义枚举变量:
也可以在定义枚举类型的同时定义变量:
有了枚举变量,就可以把列表中的值赋给它:
或者:
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用 & 取得它们的地址。这就是枚举的本质。
枚举类型变量需要存放的是一个整数,它的长度和 int 相同。
递归
dfs(int r[], int i)
{
if(i>=40)
{
枚举的搜索;
return ;
}
for(r[i]=0;r[i]<3;r[i]++)
dfs(r,i+1);
}
调用的时候用dfs(r,0)就可以啦
枚举类型是一种的值类型,它用于声明一组命名的常数。
(1)枚举的声明:枚举声明用于声明新的枚举类型。
访问修辞符 enum 枚举名:基础类型
{
枚举成员
}
基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。
(2)枚举成员
枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。 示例:
public enum TimeofDay:uint
{
Morning=-3,
Afternoon=-2,
Evening=-1
}
产生编译时错误,原因是常数值 -1、-2 和 –3 不在基础整型 uint 的范围内。
(3)枚举成员默认值
在枚举类型中声明的第一个枚举成员它的默值为零。
以后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加 1 得到的。这样增加后的值必须在该基础类型可表示的值的范围内;否则,会出现编译时错误。
枚举常量名应该按标识符的命名规则:即不能使用关键字作为变量名,以字母或下划线开头,等等;或者可以使用 “枚举常量名=常量表达式” 的形式来表示。
你以常数(constant )作为枚举常量名,故报错。
以上就是关于巧妙填数 枚举法(求C代码)全部的内容,包括:巧妙填数 枚举法(求C代码)、C语言枚举类型,知道这些你就会了、c语言大量未知数枚举问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)