/* 问题描叙: 在一个矩阵中布局皇后使所有相邻的皇后既不在同一行 * 也不在同一列和同一对角线上。下面的是以前写的,死算,效率很低。 */ #include <stdio.h>#include <math.h>#include <mem.h> int test(int i,int j,int n,int *stack) /* 检查位置是否合理 */{ int m,d; for(m = 0; m < n; m ++) { d = *(stack + m); if( d == -1) continue; else if(d == i || fabs(m - j) == fabs(i - d)) return 1; } return 0;} void OutToScreen(int *matrix,int npos,int n){ int i,j; printf("\nLayout:%d\n\n",npos); for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { if( *(matrix + i*n + j) ) printf("%2c",1); /* 头像 */ else printf("%2c",219); /* 小方格 */ } printf("\n\n"); }} /* 创建文件成功结果保存到磁盘 */void OutToDisk(int *matrix,int npos,int n,FILE **fp){ int i,j; fprintf(*fp,"\nLayout:%d\n\n",npos); for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { if( *(matrix + i*n + j) ) fprintf(*fp,"%2c",'@'); else fprintf(*fp,"%2c",'*'); } fprintf(*fp,"\n\n"); }} void main(){ int *matrix,*stack; int n,npos = 0,i = 0,j = 0; FILE *fp = 0; /* 某些编译器没有定义NULL */ clrscr(); printf("\n\nEnter the number of empress(n > 1):"); scanf("%d",&n); matrix = (int *)malloc(n * n * sizeof(int)); /* 分配内存区 */ stack = (int *)malloc(n * sizeof(int)); memset(matrix,0,n * n * sizeof(int)); /* 初始化 */ memset(stack,-1,n * sizeof(int)); fp = fopen("out.txt","w+"); if( !fp ) /* 创建文件成功同时将结果保存到文件 */ printf("\nCreat out.txt success,all result will also save to the file !"); while( 1 ) { while( i < n) { if( test(i,j,n,stack) ) i ++; else { *(stack + j) = i; /* 第j个皇后的位置 */ *(matrix + i*n + j) = 1; /* 该位置有皇后占领 */ break; } } if( i == n) /* 所有位置均不适合 */ { if(j == 0) break; /* 0 皇后没位置,搜索结束 */ else { *(stack + j) = -1; /* 恢复初始值 */ j --; /* 处理前一个皇后 */ i = *(stack + j); *(matrix + i*n + j) = 0; /* 恢复初始值 */ i ++; /* 搜索下一个位置 */ } } else if(j == n - 1) /* 搜索到一种合理布局 */ { npos ++; OutToScreen(matrix,npos,n); if( fp ) OutToDisk(matrix,npos,n,&fp); *(stack + j) = -1; /* j皇后回到初始状态 */ *(matrix + i * n + j) = 0; j --; i = *(stack + j); /* 改变前一个皇后的位置 */ *(matrix + i * n + j) = 0; i ++; } else { i = 0; j ++; /* 处理下一个皇后的位置 */ } } if(fp) fclose(fp); free(matrix); free(stack); /* 释放内存空间 */}

评论