N皇后非递归算法

第一次分享知识,有什么可以改进的地方请多指教

void IterateriveChessInNNumber(int iNumN)
{
 int iCurHigh = 0,iCurWidth = 0;//当前扫描到棋盘第iCurHigh行,第iCurWidth列
 int *pCol = new int[iNumN];//这个代表的是每一行放了的棋子的x坐标
 bool *pMap = new bool[iNumN * iNumN];//这个数组模拟了棋盘,true代表放了棋子,false代表没有棋子
 memset(pMap,0,iNumN * iNumN);
 do
 {
  if (iCurWidth < iNumN)
  {
   if (0 == iCurHigh)//在第一行就直接可以走过去
   {
    //stack.push(iCurWidth);
    pMap[iCurHigh * iNumN + iCurWidth] = true;
    pCol[iCurHigh++] = iCurWidth;
    iCurWidth = 0;
   }
   else
   {
    bool bIfFind = true;
    for (int i = 0;i < iCurHigh;++i)
    {
     if (iCurWidth == pCol[i] || 
      abs(iCurWidth - pCol[i]) == abs(i - iCurHigh))
     {
      bIfFind = false;
      break;
     }
    }
    if (bIfFind)
    {
     pMap[iCurHigh * iNumN + iCurWidth] = true;
     if (iCurHigh == iNumN - 1)//到了最后一行也能放棋子,就显示
     {
      for (int iH = 0;iH < iNumN;++iH)
      {
       for (int iW = 0;iW < iNumN;++iW)
        cout<<(true == pMap[iH * iNumN + iW] ? "★" : "□");
       cout<<endl;
      }
      cout<<"-------------------------------"<<endl;
      //找到一组正确的数字,就要把前面一步的走过的设置为没有走过
      //并且,要退回到倒数第二行查找还有没有合适的路径
      pMap[iCurHigh * iNumN + iCurWidth] = false;
      iCurWidth = iNumN;
      //找到一组正确的摆放位置了,也要回溯到上一行查找看有没有
      //合适的摆放位置,把当前iCurWidth(扫描到的横坐标)设置成iNumN
      //,则可以直接进入回溯的判断哪里去退回到上一行
     }
     else
     {
      pCol[iCurHigh++] = iCurWidth;
      iCurWidth = 0;
     }
    }
    else
     iCurWidth++;
   }
  } 
  else//----------    回溯的判断    -----------
  {//没找到,回退到上一步重新找;
   if (iCurHigh > 0)
   {
    pMap[(iCurHigh - 1) * iNumN + pCol[iCurHigh - 1]] = false;
    iCurWidth = pCol[iCurHigh - 1] + 1;
    //退回到上一行以后,是从上一行保存的x坐标的下一个开始判断是否能放棋子
    //所以把当前扫描到的棋盘的横坐标设置为保存在pCol数组的横坐标加一
   }
   iCurHigh--;
   //这一行没找到,要退回上一行,就要把iCurHigh减一才能到上一行
  }
 } while (iCurHigh > -1);
   delete [] pCol;
   delete []pMap;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值