八皇后问题及解答
++*(queenArray+(--countSum));
*(queenArray+countSum+1)=0;}else{
*(queenArray+countSum--)=0;
if(*(queenArray+countSum)<queenSum) ++*(queenArray+countSum);
placequeen
(0);
System.out.println("\n\n\n八皇后共有"+oktimes+"个解法made by yifi 2003");}
publicstaticvoidplacequeen(intnum){//num为现在要放置的行数inti=0;
booleanqsave[]=newboolean[QueenMax];
++*(queenArray+countSum);}continue;}}
else {
++*(queenArray+countSum);
continue;}}
queenPosition++;
for(printCount=1;printCount<=queenSum;printCount++)
printf("%3d%",*(queenArray+printCount));
posArray2[deep] = j;
deep++;
FindQuePos(posArray2,queen_num,deep);
deep--;
free(posArray2);}}}}
int main(int argc,char **argv){int *posArray;
if(argc < 2)
FindQuePos(posArray,8,0);
for(;i<QueenMax;i++)qsave[i]=true;
//下面先把安全位数组完成
i=0;//i是现在要检查的数组值
while(i<num){
qsave[chess[i]]=false;
intk=num-i;
if((chess[i]+k>=0)&&(chess[i]+k<QueenMax))qsave[chess[i]+k]=false;
if((chess[i]-k>=0)&&(chess[i]-k<QueenMax))qsave[chess[i]-k]=false;
i++;}//下面历遍安全位
for(i=0;i<QueenMax;i++){
if(qsave[i]==false)continue;
if(num<QueenMax-1){
d=y-i;
//检查新皇后是否与以前的皇后能相互攻击
if((j==x)||(j==x-d)||(j==x+d))
break;}if(i>=y)
break;//不攻击}if(x==SIZE)//没有合适的位置{if(0==y){//回朔到了第一行
Console.WriteLine("Done");
break;//结束}//回朔
#include "stdio.h"
int attacked(int *array,int position){
int flag=-1;
float step;
if(position==1) return flag;
for(step=
1.00;step<position;step++){
if(*(array+(int)step)==*(array+position)||step==position) return
1;
if(((*(array+(int)step)-*(array+position))/(step-position))==1||((*
(array+(int)step)-*(array+position))/(step-position))==-1){
flag=1;
break;}}
return flag;}void main(void){
static final int QueenMax = 8;
static int oktimes = 0;
static int chess[] = new int[QueenMax];//每一个Queen的放置位置
public static void main(String args[]){
for (int i=0;i<QueenMax;i++)chess[i]=-1;
Stringrow="第"+(i+1)+"行:
";
if(chess[i]==0);
else
for(intj=0;j<chess[i];j++)row+="--";
ቤተ መጻሕፍቲ ባይዱrow+="++";
intj=chess[i];
while(j<QueenMax-1){row+="--";j++;}
System.out.println(row);}}}//历遍完成就停止}}
else
FindQuePos(posArray,atoi(argv[1]),0);
printf("Have %d cases !\n",NUM);}//8 Queen递归算法
//如果有一个Q为chess[i]=j;
//则不安全的地方是k行j位置,j+k-i位置,j-k+i位置
class Queen8{
printf("input you queenSum here:
");
scanf("%d",&queenSum);
fflush(stdin);
if(queenSum<4){
printf("the %d queen's sum is 0\n",queenSum);
return;}for(;;){
if(countSum<queenSum){
printf("the %d queen's sum is %d\n",queenSum,queenPosition);}--
谁能告诉我!!现在完成一件耗日持久的事后,不再象以前有轻松的感觉??
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int NUM = 0;
void FindQuePos(int *posArray, int queen_num,int deep){int i;
if(deep == queen_num){for(i = 0;i < queen_num;i++)
printf("(%d,%d) ",i+1,posArray[i]+1);
++*(queenArray+(++countSum));}else{
if(attacked(queenArray,countSum)==1){
if(*(queenArray+countSum)>=queenSum){
if(*(queenArray+countSum-1)<queenSum){
++*(queenArray+(--countSum));
chess[num]=i;
placequeen(num+1);}else{//numislastone
chess[num]=i;
oktimes++;
System.out.println("这是第"+oktimes+"个解法如下:
");
System.out.println("第n行:");
for(i=0;i<QueenMax;i++){
if(Queen[i]==j)
Console.Write('Q');
else
Console.Write('.');
Console.WriteLine();}y=SIZE-1;//回朔}}}}}八皇后有解92个。
else{
if(countSum==1&&*(queenArray+countSum)==queenSum) break;
*(queenArray+countSum--)=0;
++*(queenArray+countSum);}}}else
++*(queenArray+countSum);}else
if(printCount>=queenSum) printf("\n");
if(*(queenArray+countSum)>=queenSum){
++*(queenArray+(--countSum)); //the "++" priority is different