八皇后乃至N皇后问题

来源:互联网 发布:美萍软件价格 编辑:程序博客网 时间:2024/05/16 06:32
 

西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八
个皇后如何相安无事的放置在棋盘上,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;

}

原创粉丝点击