八皇后乃至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;
}
个皇后如何相安无事的放置在棋盘上,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;
}
相关文章推荐
- 八皇后乃至n皇后问题
- 由当时的八皇后而联想到的N皇后的问题
- 八皇后问题—>n皇后问题
- 八皇后(N皇后)问题算法程序(回溯法)
- 八皇后问题算什么,来看看无穷皇后问题吧(转自Matrix67牛)——思考的乐趣
- c++算法之回溯 八皇后延伸 N皇后问题
- 八皇后及n皇后问题
- 八皇后 n皇后 问题
- 八皇后(N皇后)问题算法程序(回溯法)
- 由八皇后问题到n皇后的推广
- 八皇后以及N皇后问题分析
- 蓝桥杯练习题 BASIC-27 2n皇后问题(八皇后问题 搜索)
- 第1次实验——八皇后及N皇后问题
- 八皇后扩展--n皇后问题 使用回溯法
- 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)
- 八皇后问题,Java实现,可推广解决N皇后问题
- 八皇后问题(N皇后问题)
- 从八皇后问题到2n皇后问题
- 八皇后问题的扩展,任意数量皇后问题的较快速解法
- 八皇后问题——列出所有的解,可推至N皇后