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

其他智力游戏

开发平台:

Visual C++

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