用c++实现的8皇后问题

最近弄弄一些经典的算法,八皇后是其一。
在8*8的棋盘上摆8个皇后,使任2皇后不在同一行、列、对角线上,有几种摆法?
可以扩展到N皇后。
#include  < iostream >
#include 
< string >
using   namespace  std;

#define  NUM 8

char  cache[NUM][NUM]  =   {0} ;
void  queen( int  row,  int  max)
{
 
// 依次放置在列上
 for (int i = 0; i < max; ++i)
 
{
  
// 清空当前行
  memset(cache[row], 'x', max);
  
  
bool fHas = false;
  
// 判断同一列
  for(int irow = 0; irow < row; ++irow)
  
{
   
if(cache[irow][i] == 'o')
   
{
    fHas 
= true;
    
break;
   }


   
// 对角线是否有皇后
   int icol = i;
   
if(icol + (row - irow) < max)
   
{
    
if(cache[irow][icol + (row - irow)] == 'o')
    
{
     fHas 
= true;
     
break;
    }

   }


   
if(icol - (row - irow) >= 0)
   
{
    
if(cache[irow][icol - (row - irow)] == 'o')
    
{
     fHas 
= true;
     
break;
    }

   }

  }


  
if(fHas)
   
continue;

  cache[row][i] 
= 'o';

  
if(row < max - 1)
   queen(row 
+ 1, max);

  
if(row == max - 1)
  
{
   
for (int i = 0; i < max; ++i)
   
{
    
for (int j = 0; j < max; ++j)
    
{
     cout
<< cache[i][j]<< " ";
    }


    cout
<< endl;
   }


   cout
<< endl;
  }

 }


}


int  main( int  argc,  char *  argv[])
{
 queen(
0, NUM);
 
return 0;
}

转载于:https://www.cnblogs.com/yoran/archive/2008/02/28/1084530.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值