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; //解的个数
- //如果在第c列、第r行放置一个皇后,跟前面已经放置好的皇后没有冲突,则返回1,否则返回0
- int judge( int r, int c )
- {
- int i;
- for( i=0; i<c; i++ ) //检查前面c-1列各列,是否在第r行有皇后
- {
- if( queen[r][i]==1 ) break;
- }
- if( i<c ) return 0;
- //检查前面c-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;
- //检查前面c-1列各列,与[r][c]位置位于同一条次对角线上是否有皇后
- for( i=1; r+i<N&&c-i>=0; i++ )
- {
- if(queen[r+i][c-i]==1) break;
- }
- if(r+i<N&&c-i>=0) return 0;
- return 1;
- }
- void search( int step ) //考虑第step列的每个位置
- {
- int k;
- for( k=0; k<N; k++ ) //第step列的每个位置
- {
- if( judge(k,step) ) //如果在第step列、第k行可以放置一个皇后
- {
- queen[k][step] = 1; //放置皇后
- if( step==N-1 ) //第N-1列放置好了,找到一个解
- count++;
- search( step+1 );
- queen[k][step] = 0; //移除皇后
- }
- }
- }
- void main( )
- {
- printf( "Please input N : " );
- scanf( "%d", &N );
- count = 0;
- memset( queen, 0, sizeof(queen) );
- search( 0 ); //从第0列开始放置
- printf( "%dn", count );
- }