#include <iostream> using namespace std; bool hang(char xq[][9],int x) //行是否被攻击 { for(int u=0;u<8;u++) { if(xq[x][u]=='*') break; } if(xq[x][u]=='*') return false; else return true; } bool lie(char xq[][9],int y) //列 { for(int o=0;o<8;o++) { if(xq[o][y]=='*') break; } if(xq[o][y]=='*') return false; else return true; } bool duijiao(char xq[][9],int x,int y) //主对角线 { if(x>y) { for(int q=0,w=x-y;q<8,w<8;q++,w++) { if(xq[w][q]=='*') break; } if(xq[w][q]=='*') return false; else return true; } else { for(int q=0,w=y-x;q<8,w<8;q++,w++) { if(xq[q][w]=='*') break; } if(xq[q][w]=='*') return false; else return true; } } bool du(char xq[][9],int x,int y) //副对角线 { if(x+y>=7) { for(int q=7,w=x+y-7;q>=0,w<8;q--,w++) { if(xq[w][q]=='*') break; } if(xq[w][q]=='*') return false; else return true; } else { for(int w=0,q=x+y;w<8,q>=0;w++,q--) { if(xq[w][q]=='*') break; } if(xq[w][q]=='*') return false; else return true; } } int main() { char xq[9][9]; int i,j,z[9],m=1,n=0; for(i=0;i<8;i++) { z[i]=-1; } for(i=0;i<8;i++) { for(j=0;j<8;j++) xq[i][j]='$'; } j=0,i=0; while(m<=20) {for(i=n;i<8;i++) { for(j=0;j<8;j++) xq[i][j]='$'; //if(i==0) h=-1; //else //h=z[i-1]; //if(h==7) h=0; for(j=z[i]+1;j<8;j++) { //if(j==z[i]) j=j+1; if(j==8) break; if((hang(xq,i))&&(lie(xq,j))&&(duijiao(xq,i,j))&&(du(xq,i,j))) { xq[i][j]='*'; z[i]=j; } if(xq[i][j]=='*') break; } if((xq[i][j-1]=='$')&&(j==8)) { z[i]=-1; i=i-2; for(j=0;j<8;j++) { xq[i+1][j]='$';} } } cout<<"第"<<m<<"组解为:"<<endl; for(i=0;i<8;i++) { if(i>0) cout<<endl; for(j=0;j<8;j++) cout<<xq[i][j]<<' '; } n=i-1; cout<<endl; m++; } return 0; }
本题没有使用网上说的栈,利用了回溯的算法!也不能判断一共能有几组解,直接控制解得输出个数!
如果输出的解多出解得个数