#include < stdio.h >
#include < stdlib.h >#define N 4 //棋盘行数列数
#define OK 1
#define ERROR 0//初始棋盘
int Data[ N ][ N ] = { { 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } } ;
static int times = 0 ; //解法的种数int IsReasonal( int row , int col ) //第i行第j列布棋子是否合理
{
int i , j ;
for( i = 0 ; i < N ; ++ i )
{
if( ( i != col - 1 ) && Data[ row - 1 ][ i ] == 1 )
return ERROR ; //该行不合理
if( ( i != row - 1 ) && Data[ i ][ col - 1 ] == 1 )
return ERROR ; //该列不合理
if( row == col && Data[ i ][ i ] == 1 )
return ERROR ; //主对角线不合理
if( 5 == ( row + col ) )
{
for( j = 0 ; j < N ; ++ j )
{
if( 3 == ( i + j ) && Data[ i ][ j ] == 1 )
return ERROR ; //副对角线不合理
}
}
}
return OK ;
}void Output( )
{
int i , j ;
printf( "第%d种解法:\n" , ++times ) ;
for( i = 0 ; i < N ; ++ i )
{
for( j = 0 ; j < N ; ++ j )
printf( "%d " , Data[ i ][ j ] ) ;
printf( "\n" ) ;
}
printf( "\n" ) ;
}void Trial( int i , int n )
{ //进入本函数时,在n*n棋盘前i-1行已放置了互不攻击的i-1个棋子,现从第i行起继续为后续棋子选择合适位置
//当i>n时,求得一个合法布局,则输出
int j ;if( i > n )
{
//输出当前布局
Output( ) ;
}
else
{
for( j = 1 ; j <= n ; ++ j )
{
//在第i行第j列放置一个棋子
Data[ i - 1 ][ j - 1 ] = 1 ;if( IsReasonal( i , j ) )
Trial( i + 1 , n ) ;//移走第i行第j列放置一个棋子
Data[ i - 1 ][ j - 1 ] = 0 ;
}
}
}int main( )
{
Trial( 1 , N ) ;
return 0 ;
}
第六章(9).四皇后问题
最新推荐文章于 2022-10-10 20:57:11 发布