正文

n 皇后问题2007-05-18 07:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/25969.html

分享到:

/*  问题描叙: 在一个矩阵中布局皇后使所有相邻的皇后既不在同一行 *  也不在同一列和同一对角线上。下面的是以前写的,死算,效率很低。 */ #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);     /* 释放内存空间 */}

阅读(4055) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册