写出所有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)
}
}