c语言,有没有办法遍历枚举类型

Python018

c语言,有没有办法遍历枚举类型,第1张

在C语言中,枚举类型是被当做int或者unsignedint类型来处理的,所以按照C语言规范是没有办法遍历枚举类型的。不过在一些特殊的情况下,可以实现有条件的遍历。1枚举类型必须连续。由于枚举类型支持如下方式定义:enum{ENUM_0,ENUM_10=10,ENUM_11}这样就会导致枚举类型不连续,这种枚举无法遍历。2枚举类型中人为加入起始及结束标记。enum{ENUM_START,ENUM_0,ENUM_1,ENUM_2,ENUM_END}可以看到,在这个枚举类型中,人为加入可ENUM_START,和ENUM_END。中间的ENUM_0,ENUM_1,ENUM_2才是实际的有效数据。当后续需要增删枚举元素时,也要保证ENUM_START,和ENUM_END分别为最小和最大值。满足以上两种条件下,就可以做枚举的遍历了,参考代码如下:intifor(i=ENUM_START+1i<ENUM_ENDi++){//使用枚举元素。}这个循环中,i的值就是所有有效的枚举元素值。

思路1:

写出所有24种4个数的排列,存到一个数组里,假如数组是P[24][4];

那么可以

for

(i

=

0

i

<

24

i++)

for

(j

=

0

j

<

24

j++)

for

(k

=

0

k

<

24

k++)

三层循环,P[i],P[j],P[k]分别是矩阵的三个列

思路2:

利用dfs递归枚举

int

used[3][4]/*这个数组存放三个列中0~3这四个数是否已在这一列中出现过,需要提前清零*/

int

mat[3][4]/*要枚举的矩阵*/

void

dfs(int

col,

int

row)/*col表示现在已经搜索到哪一列(从0开始编号),row表示这一列已经填了几行*/

{

int

i

if

(col

==

2

&&

row

==

4)

{

....../*运行到这里的时候,mat就是枚举到的一个矩阵*/

return

}

if

(row

==

4)

{row

=

0

col++}

for

(i

=

0

i

<

4

i++)

if

(!used[col][i])

{

used[col][i]

=

1

mat[col][row]

=

i

dfs(col,

row

+

1)

used[col][i]

=

0

}

return

}

调用的时候调用dfs(0,0)