第一次分享知识,有什么可以改进的地方请多指教
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;
}
N皇后非递归算法
最新推荐文章于 2024-04-02 19:03:40 发布