问题描述:
这是一个比较经典的问题,棋盘上有8x8共64个格子,要求将八个皇后放置到棋盘上,同时满足任意两个皇后不同行,不同列,并且不位于同一斜线上(45度和135度的斜线),这个问题采用的是回溯法解决的,下述代码是经过学习研究别人的代码得到。
代码如下:
#include <iostream> #include <stdlib.h> #include <math.h> using namespace std; int position[9]; char map[9][9]; int sum=0; bool Place(int x,int row) { for(int i=1;i<row;i++) { int y=position[i]; if(abs(x-y)==abs(row-i)) //如果位于同一条斜线上 return false; else if(position[i]==x) //如果位于同一列上 return false; } return true; } void Seek(int t) { if(t>8) //如果t大于8则说明8个皇后位置都已找到 { sum++; //方案数目计数变量自加 cout<<"No:"<<sum<<endl; for(int i=1;i<=8;i++) //打印皇后的位置 cout<<position[i]<<" "; cout<<endl; for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) map[i][j]='.'; } for(int i=1;i<=8;i++) { int j=position[i]; map[i][j]='A'; } for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) cout<<map[i][j]<<" "; cout<<endl; } } else { for(int i=1;i<=8;i++) if(Place(i,t)) { position[t]=i; Seek(t+1); } } } int main() { for(int i=1;i<=8;i++) //初始化存放每行皇后位置的数组 position[i]=0; Seek(1); //调用寻找皇后位置的函数 cout<<"Sum:"<<sum<<endl; return 0; }