N皇后问题(基本的搜索法)

/*
N后问题
*/


#include 
< stdio.h >
#include 
< math.h >

#define  MAX 101

int  total  =   0 ;
char  m[MAX][MAX];
 

int  is_ok( int  s, int  i, int   * a)
{
    
int j ;
    
for(j=1 ; j< s ; j++)
    
if( (abs(i-a[j]) == abs(s-j)) || (i == a[j])) /*按行填入,所以只要检查列和斜列是否有皇后即可*/
        
return 0 ;
    
return 1 ;
}


void  nfind( int  s, int  n, int   * a)
{
    
int i,p,q;

    
if( s > n)
    
{
        total 
++ ;
        printf(
"========The num of %d is ========== ",total); 
        
for(p=1 ; p<= n ; p++)
        
{
            
for(q=1; q<=n ; q++)
                printf(
"%c ",m[p][q]);
            printf(
" ");
        }

        
    }

    
else
    
{
        
for(i=1 ;i<= n; i++)
     
            
if(is_ok(s,i,a))
            

                 
                a[s]
=i ;
                m[s][i]
='O' ;
                nfind(s
+1,n,a);
                m[s][i]
='*' ;
             
            }

         
    }




}


int  main( void )
{

    
int n ,a[MAX]={0};
    scanf(
"%d",&n);
    memset(m,
'*',sizeof(m));
    nfind(
1,n,a);
    printf(
" total=%d ",total);
    system(
"pause");
    
return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值