NQueen6.cpp
上传用户:hncsjd
上传日期:2022-07-08
资源大小:3772k
文件大小:2k
源码类别:

其他智力游戏

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #define MAXN 21
  5. int N; //N皇后问题的规模
  6. int queen[MAXN][MAXN]; //棋盘各位置(1表示放置了皇后,0表示没有放置)
  7. int count; //解的个数
  8. int solution[100]; //(以整数形式存储每个解)
  9. int num1, num2; //解对应的整数,及转置后得到的整数
  10. //如果在第r行、第c列放置一个皇后,跟前面已经放置好的皇后没有冲突,则返回1,否则返回0
  11. int judge( int r, int c )
  12. {
  13. int i;
  14. for( i=0; i<r; i++ ) //检查前面r-1行各行,是否在第c列有皇后
  15. {
  16. if( queen[i][c]==1 )  break;
  17. }
  18. if( i<r )  return 0;
  19. //检查前面r-1行各行,与[r][c]位置位于同一条主对角线上是否有皇后
  20. for( i=1; r-i>=0&&c-i>=0; i++ )
  21. {
  22. if(queen[r-i][c-i]==1)  break;
  23. }
  24. if(r-i>=0&&c-i>=0)  return 0;
  25. //检查前面r-1行各行,与[r][c]位置位于同一条次对角线上是否有皇后
  26. for( i=1; r-i>=0&&c+i<N; i++ )
  27. {
  28. if(queen[r-i][c+i]==1)  break;
  29. }
  30. if(r-i>=0&&c+i<N)  return 0;
  31. return 1;
  32. }
  33. void search( int step ) //考虑第step行的每个位置
  34. {
  35. int j, k;
  36. for( k=0; k<N; k++ ) //第step行的每个位置
  37. {
  38. if( judge(step,k) ) //如果在第step行、第k列可以放置一个皇后
  39. {
  40. queen[step][k] = 1; //放置皇后
  41. num1 = num1*10 + k;  num2 += step * (int)pow(10,7-k);
  42. if( step==N-1 ) //第N-1行放置好了,找到一个解
  43. {
  44. for( j=0; j<count; j++ )
  45. if( num2==solution[j] )  break;
  46. if( j>=count )
  47. solution[count++] = num1;
  48. }
  49. search( step+1 );
  50. queen[step][k] = 0; //移除皇后
  51. num1 = (num1-k)/10;  num2 -= step * (int)pow(10,7-k);
  52. }
  53. }
  54. }
  55. void main( )
  56. {
  57. N = 8;
  58. count = 0;  num1 = 0;
  59. memset( queen, 0, sizeof(queen) );  memset( solution, 0, sizeof(solution) );
  60. search( 0 ); //从第0行开始放置
  61. printf( "%dn", count );
  62. }