您的位置:首页 > 其它

八皇后乃至N皇后问题

2011-11-30 16:31 197 查看
西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八

个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问

题来讲解程式设计之技巧。

解决思路:

1维数组szResult[i]依次表示第i行对应的皇后的所在的列。

采用遍历方式

第i行皇后所在的列从0到N

分别判断 此时是否出现重复现象,如果重复则无需继续遍历,如果不重复则遍历i+1行

直到遍历完所有的行

#include <stdio.h>

#include <string>

/*

using namespace std;

*/

#define QUEEN_CNT 8

int szResult[QUEEN_CNT]={0};

int g_iRetCnt =0;

void PrintRet()

{

g_iRetCnt++;

printf("结果%d:\r\n",g_iRetCnt);

for (int i = 0 ;i < QUEEN_CNT;i++)

{

printf("%d",szResult[i]);

}

printf("\r\n");

}

/*

肯定不在同一行

*/

bool IsSafe(int iIndex,int iVal)

{

for (int i =0; i < iIndex; i++)

{

if (szResult[i] == iVal ||

iIndex + szResult[i] == iVal + i

||iIndex +iVal == szResult[i] +i)

{//判断是否在同一列 对角线

return false;

}

}

return true;

}

void Check(int iIndex)

{

for (int i = 0; i< QUEEN_CNT; i++)

{

if (!IsSafe( iIndex, i))

{

continue ;

}

szResult[iIndex] = i;

if (iIndex == QUEEN_CNT -1 )

{

PrintRet();

}

else

{

Check(iIndex+1);

}

}

}

int _tmain(int argc, _TCHAR* argv[])

{

Check(0);

getchar();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: