问题描述
问题是下面算法,为什么得不到真确结果?publicclassTest{publicstaticintn=8;//棋盘行列数publicstaticintcount=0;//皇后解法个数publicstaticQueen[]stack=newQueen[n];//皇后栈publicstaticinttop=0;//栈顶//利用栈publicstaticvoidsearch3(){//cur行if(top==n){count++;}else{for(inti=0;i<n;i++){//顺序尝试放在cur行的i列booleanOk=true;for(intj=0;j<top;j++){//判断是否与前面放置的皇后冲突if(stack[j].row==top||stack[j].col==i||stack[j].col+stack[j].row==top+j||stack[j].col-stack[j].row==top-j){Ok=false;break;}}if(Ok){//如果不冲突stack[top]=newQueen(top,i);top++;System.out.println(top);search3();top--;}}}}publicstaticvoidmain(String[]args){search3();System.out.println(count);}
解决方案
解决方案二:
都是一个套路懒得看了,我翻了一下以前写的代码,可以参考一下。#include<iostream>#include<stdlib.h>#include<fstream>usingnamespacestd;voidOutput();voidEightQueen(int);intICount=0;//记录方案个数intWeiZhi[9];//记录棋子位置int_tmain(intargc,_TCHAR*argv[]){cout<<"八皇后问题求解:"<<endl;EightQueen(0);//求解cout<<endl<<"一共有"<<ICount<<"种解法"<<endl<<endl;system("pause");return0;}voidOutput()//输出函数{cout<<endl<<"第"<<++ICount<<"种方案:"<<endl;cout<<"0";for(inti=0;i<8;i++)//输出棋盘行号码{cout<<""<<i+1;}cout<<endl;for(inti=0;i<8;i++){cout<<""<<i+1<<"";//列号码for(intj=0;j<8;j++){if(WeiZhi[i]-1==j)//如果Weizhi存储的位置等于列号输出棋子{cout<<"■";//输出皇后}else{cout<<"□";//输出棋盘}}cout<<endl;}cout<<endl;}voidEightQueen(intn){boolsafe=1;//是否冲突,0为冲突,1为安全if(n==8)//若8个皇后放置完毕{Output();//输出结果return;}for(inti=1;i<=8;i++)//试探{WeiZhi[n]=i;//在该列第i行放置safe=1;//判断第n个皇后是否与前边的皇后形成冲突for(intj=0;j<n;j++){if((WeiZhi[j]==WeiZhi[n])||(abs(WeiZhi[j]-WeiZhi[n])==(n-j)))//形成攻击{safe=0;}}if(safe==1)//没有冲突就试探下一列{EightQueen(n+1);//递归调用}}}