queen issue

#include     <stdio.h>    
#include     <conio.h>    
#include     <math.h>    
#include     <stdlib.h> 
 
#define QUEENS 8      
//!记录解的序号的全局变量。
int iCount=0; 
//!记录皇后在各列上的放置位置的全局数组。
int Site[QUEENS];    
//!递归求解的函数。    
void Queen(int n);   
//!输出一个解。                
void Output();
//!判断第n个皇后放上去之后,是否有冲突。
int IsValid(int n);   
/*----------------------------Main:主函数。----------------------------*/    
main()    
{
 //!从第0列开始递归试探。    
    Queen(0);    
    //!按任意键返回。    
    if(getch())
  system("pause");
    return 1;
}    
 
/*-----------------Queen:递归放置第n个皇后,程序的核心!----------------*/    
void Queen(int n)    
{    
 int i;
 //!参数n从0开始,等于8时便试出了一个解,将它输出并回溯。    
 if(n == QUEENS)   
 {    
  Output();    
  return;    
 }        
 //!n还没到8,在第n列的各个行上依次试探。    
 for(i=1;i<=QUEENS;i++)    
 {    
  //!在该列的第i行上放置皇后。    
  Site[n]=i;    
  //!如果放置没有冲突,就开始下一列的试探。    
  if(IsValid(n))
   Queen(n+1);    
 }
}    
/*------IsValid:判断第n个皇后放上去之后,是否合法,即是否无冲突。------*/    
int IsValid(int n)    
{    
 int i;    
 //!将第n个皇后的位置依次于前面n-1个皇后的位置比较。    
 for(i=0;i<n;i++)    
 {    
  //!两个皇后在同一行上,返回0。    
  if(Site[i] == Site[n])    
  return 0; 
  //!两个皇后在同一对角线上,返回0。    
  if((Site[i]-Site[n])==(n-i))    
  return 0; 
  if((Site[i] - Site[n]) == (i-n))
  return   0;
 }    
 //!没有冲突,返回1。    
 return     1;    
}    
 
/*------------Output:输出一个解,即一种没有冲突的放置方案。------------*/    
void Output()    
{    
 int i;    
 //!输出序号。    
 printf("No.%-5d",++iCount);    
 //!依次输出各个列上的皇后的位置,即所在的行数。    
 for(i=0;i<QUEENS;i++)    
  printf("%d", Site[i]);    
 printf("/n");    
}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值