巧妙填数 枚举法(求C代码)

巧妙填数 枚举法(求C代码),第1张

输出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语言大量未知数枚举问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9873634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存