C语言的遍历算法

Python023

C语言的遍历算法,第1张

思路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)

#include <stdio.h> #include <dos.h> #include <errno.h> #include <io.h> #include <dirent.h> #include <dir.h> #include <string.h> #include <sys\stat.h> #include "pm03a.h" void main(int argc,char* argv[]) { //printf("Number %d\n",ConfirmFileAttrib(argv[1])) GetDirectory(argv[1]) printf("\nSearch Over.\n") } //------------------------------------------------------------------ //pm03a.h //------------------------------------------------------------------void GetDirectory(char *DirectoryName) int ConfirmFileAttrib(char* filename) char *GetCurrentPath() char* GetFullFileName(char *filename) char *WillDeleteFile(char *FileName) //-------------------------------------------------------- //--------------- 获得文件属性 --------------------------- //-------------------------------------------------------- int ConfirmFileAttrib(char* filename) { int temp=0 int attrib=(_rtl_chmod(filename,0)) if(attrib==-1) { switch(errno) { case ENOENT: //printf("%s Path or file not found.\n",filename) temp=0 break case EACCES: //printf("Permission denied.\n") temp=-1 break default: //printf("Error number: %d", errno) temp=-2 break } } else { if(attrib &FA_RDONLY) { temp=1 //printf("%s is read-only.\n", filename) } if(attrib &FA_HIDDEN) { temp=2 //printf("%s is hidden.\n", filename) } if(attrib &FA_SYSTEM) { temp=3 //printf("%s is a system file.\n", filename) } if(attrib &FA_DIREC) { temp=4 //printf("%s is a directory.\n", filename) } if (attrib &FA_ARCH) { temp=5 //printf("%s is an archive file.\n", filename) } } return temp } //-------------------------------------------------------- //-------------------------------------------------------- //--------------- 获取目录流 ----------------------------- //-------------------------------------------------------- void GetDirectory(char *DirectoryName) { DIR* Directory_Point struct dirent *entry bool DirControl if((Directory_Point=opendir(DirectoryName))==NULL) { printf("Error opening directory!\n") return } else { if(strcmp(DirectoryName,"..")==0) { return } if(strcmp(DirectoryName,".")==0) DirControl=true else DirControl=false chdir(DirectoryName) //char *filename=DirectoryName //int k=creat(strcat(filename,".txt"),S_IWRITE) while(bool(entry=readdir(Directory_Point))) { if(ConfirmFileAttrib(entry->d_name)==5) // 确定为文件属性 { // 文件过滤 WillDeleteFile(entry->d_name) } if(ConfirmFileAttrib(entry->d_name)==4) // 确定为目录属性 { if(strcmpi(entry->d_name,"..")==0||strcmpi(entry->d_name,".")==0) { continue } else { //printf("\n%s is direct\n\n",entry->d_name) GetDirectory(entry->d_name) } } } if(!DirControl==true) chdir("..") closedir(Directory_Point) } } //-------------------------------------------------------- //-------------------------------------------------------- //---------- 判断文件类型以备过滤 ------------------------ //-------------------------------------------------------- char* GetFullFileName(char *filename) { char *FullFilename=GetCurrentPath() if(strlen(FullFilename)<=3) { strcat(FullFilename,filename) } else { strcat(FullFilename,"\\") strcat(FullFilename,filename) } return FullFilename } char *GetCurrentPath() { char path[1024]="" strcpy(path, "X:\\")/* fill string with form of response: X:\ */ path[0] = 'A' + getdisk()/* replace X with current drive letter */ getcurdir(0, path+3)/* fill rest of string with current directory */ return path } char *WillDeleteFile(char *FileName) { int len for(len=strlen(FileName)len>=0len--) { if(FileName[len]=='.') break } char* Retname int s=-1 for(int i=leni<=strlen(FileName)i++) { Retname[s+=1]=FileName[i] } int i=-1 if(Retname[1]=='~')i=0 if(strcmpi(Retname,".bak")==0)i=0 if(strcmpi(Retname,".obj")==0)i=0 if(strcmpi(Retname,".tds")==0)i=0 if(strcmpi(Retname,".dcu")==0)i=0 if(strcmpi(Retname,".tmp")==0)i=0 if(strcmpi(Retname,".ilk")==0)i=0 if(strcmpi(Retname,".pch")==0)i=0 if(strcmpi(Retname,".pdb")==0)i=0 if(strcmpi(Retname,".tlb")==0)i=0 if(strcmpi(Retname,".idb")==0)i=0 if(strcmpi(Retname,".pdb")==0)i=0 if(strcmpi(Retname,".r$p")==0)i=0 if(strcmpi(Retname,".OBR")==0)i=0 if(strcmpi(Retname,".mbt")==0)i=0 if(strcmpi(Retname,".mrt")==0)i=0 if(strcmpi(Retname,".csm")==0)i=0 if(i==0) { remove(GetFullFileName(FileName)) printf("%s delete\n",GetFullFileName(FileName)) } return Retname }

#include <stdio.h>

#include <malloc.h>

typedef struct node{

int data

struct node *lchild,*rchild

}*treetp,tree

treetp create (treetp t,int c)

void print1(treetp)

void print2(treetp)

void print3(treetp)

int number=0

void main()

{

treetp t=0,r

r=create (t,0)

printf("前序排列 :")

print1 (r)

printf("\n中序排列 :")

print2 (r)

printf("\n后序排列 :")

print3 (r)

}

treetp create(treetp t,int c)

{

treetp p,di

do{

scanf("%d",&c)

if (t==0)

{

t=(treetp)malloc(sizeof(tree))

t->lchild=t->rchild=0

t->data=c

}

else

{ p=t

while(p!=0)

{

di=p

if(c<(p->data))

p=p->lchild

else

p=p->rchild

}

if(c<(di->data))

{

treetp NEWdi=(treetp) malloc(sizeof(tree))

NEWdi->lchild=NEWdi->rchild=0

NEWdi->data=c

di->lchild=NEWdi

}

else

{

treetp NEWdi=(treetp) malloc(sizeof(tree))

NEWdi->lchild=NEWdi->rchild=0

NEWdi->data=c

di->rchild=NEWdi

}

}

++number

}while(c!=0)

printf("叶子的数量:%d",number)

return t

}

void print1(treetp t)

{

if (t!=0)

{

printf("%d ",t->data)

print1(t->lchild)

print1(t->rchild)

}

}

void print2(treetp t)

{

if (t!=0)

{

print2(t->lchild)

printf("%d ",t->data)

print2(t->rchild)

}

}

void print3(treetp t)

{

if (t!=0)

{

print3(t->lchild)

print3(t->rchild)

printf("%d ",t->data)

}

}