码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2015-05-13 12:19:01      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在国际象棋棋盘8行8列上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求有多少种摆放方法。

#include <stdio.h>
int iCount = 0;//已经放了多少的皇后
int Queens[8];//皇后放的行数,每个皇后必然占据一列,Queens[5]为第5列皇后放置的行数。

int IsValid(int n)//断第n个皇后是否与前面皇后行成攻击
{
   int i;
   for (i = 0; i < n; i++)//第n个皇后与前面n-1个皇后比较 
   {
       if (Queens[i] == Queens[n])//两个皇后在同一行上,返回0。
         return 0;
       if (abs(Queens[i] - Queens[n]) == (i - n))//两个皇后在同一对角线上,返回0。
         return 0;
   }
   return 1;//没有冲突,返回1。
}

//依次从第0列第一列第二列确定每列皇后放置的行数。
void Queen(int n)//求第n列中哪行放置皇后
{
   int i;
   if (n == 8)//第8列排完则8个皇后已放置完成
   {
      return;
   }
   for (i = 1; i <= 8; i++)//对第n列的每行上循环,从第一行开始。每列都是从0行开始检测
   { 
      Queens[n] = i;//假设第n列上放置在第i行 
      if (IsValid(n))//没有冲突,就开始下一列的试探
         Queen(n + 1); //递归调用进行下一步 
   }
}
int main()
{ 
   printf("八皇后排列方案:\n"); 
   Queen(0);//从第0列开始递归试探 
   getch();
   return 0;
}

 

八皇后问题

标签:

原文地址:http://www.cnblogs.com/yaowen/p/4499873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!