八皇后乃至N皇后问题

 

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值