NQueen6.cpp
资源名称:NQueen.rar [点击查看]
上传用户:hncsjd
上传日期:2022-07-08
资源大小:3772k
文件大小:1k
源码类别:
其他智力游戏
开发平台:
Visual C++
- #include <stdio.h>
- #include <string.h>
- #define MAXN 21
- int N; //N皇后问题的规模
- int queen[MAXN][MAXN]; //棋盘各位置(1表示放置了皇后,0表示没有放置)
- int count; //解的个数
- //如果在第r行、第c列放置一个皇后,跟前面已经放置好的皇后没有冲突,则返回1,否则返回0
- int judge( int r, int c )
- {
- int i;
- for( i=0; i<r; i++ ) //检查前面r-1行各行,是否在第c列有皇后
- {
- if( queen[i][c]==1 ) break;
- }
- if( i<r ) return 0;
- //检查前面r-1行各行,与[r][c]位置位于同一条主对角线上是否有皇后
- for( i=1; r-i>=0&&c-i>=0; i++ )
- {
- if(queen[r-i][c-i]==1) break;
- }
- if(r-i>=0&&c-i>=0) return 0;
- //检查前面r-1行各行,与[r][c]位置位于同一条次对角线上是否有皇后
- for( i=1; r-i>=0&&c+i<N; i++ )
- {
- if(queen[r-i][c+i]==1) break;
- }
- if(r-i>=0&&c+i<N) return 0;
- return 1;
- }
- void search( int step ) //考虑第step行的每个位置
- {
- int k;
- for( k=0; k<N; k++ ) //第step行的每个位置
- {
- if( judge(step,k) ) //如果在第step行、第k列可以放置一个皇后
- {
- queen[step][k] = 1; //放置皇后
- if( step==N-1 ) //第N-1行放置好了,找到一个解
- count++;
- search( step+1 );
- queen[step][k] = 0; //移除皇后
- }
- }
- }
- void main( )
- {
- printf( "Please input N : " );
- scanf( "%d", &N );
- count = 0;
- memset( queen, 0, sizeof(queen) );
- search( 0 ); //从第0行开始放置
- printf( "%dn", count );
- }