N皇后回溯算法(c语言代码)

N皇后回溯算法(c语言代码)

问题重述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。推而广之,那么n个皇后有多少摆法。

代码:

//n皇后问题
#include<stdio.h>
#include<stdlib.h>
#define NUM 100
int x[NUM];
int place(int k){//位置判断函数 
int i;
	for(i=1;i<k;i++)
	 if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k)) //是否在同一列或者在同一对角线 
	  return true;
return false;
	  
	  
}


int queen(int n)
{int count=0;
for(int i=1;i<=n;i++)//放置位置初始化 
    x[i]=0;
int k=1;//棋盘的行数
while(k>=1)
 {   x[k]=x[k]+1; //第一列 
   while(x[k]<=n&&place(k))
     x[k]=x[k]+1;// 下一列 
  
  if(x[k]<=n)//越界否 
  {
  	if(k==n) //摆完了 
	  {count++;
	   printf("%d皇后第%d种摆法为:\n",n,count);
	   for(int i=1;i<=n;i++) //输出结果 
	   printf("(%d,%d)\n",i,x[i]);
	  } 
	  else //下一行 
	  {
	  	k++;
	  }
   } 
  else  //越界了回溯 
  {x[k]=0;
   k=k-1;
  }
 
 }
return count;	
}


int main(void)
{int n;
printf("输入皇后的个数\n");
scanf("%d",&n); 
printf("%d个皇后一共有%d摆法\n",n,queen(n));
return 0;	
}
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值