递归与迭代法求解N皇后问题

 

人生的第一篇博客

写在大三路上-对编程的看法(一)

我是一名大三学生,现在已经学习了C语言,java的程序设计,在学习程序时,刚开始只能学到一些基本的语法知识,如类型的转换,if、while、for等语句。

嘿嘿,其实大家在学校都差不多吧,我从大二开始就参加了湖南省大学生研究性课题,跟着学校的一名教授做项目,当时对C语言什么的都很不熟练,所以

老师就给我一个建议,遇到程序不管看不看得懂,都要自己亲手编写,把编程能力锻炼出来,争取毕业达到20000行代码,那找工作什么的都不用愁了。

我很听话,天天敲啊敲,把打字的水平也提上来了,不过到了大二学习数据结构的时候,问题又来了,每当遇到算法题,自己就找不出编程的思维模式,

只能跟着老师的思维走,好一段时间都低落,因为自己连普通的二叉树都不能独立编写,期间经历很多事,下篇会讲到,大三到现在我只能说,独立编写程序

的能力很重要!

回溯法求解n皇后问题

 

//判断条件
void place(int k)

 for(int j=1;j<k;j++)
 if(abs(k-j)==abs(x[j]-x[k]))||(x[j]=x[k]))return false;//这里很巧妙,它用到abs绝对值便把正对角线与反对角线都判断到了,这里在n皇后程序中是判断这一行的皇后能不能满足

条件,即不在同一列,不在对角线上
 return true;

下面是回溯法处理的关键代码

其实下面两个算法在递归,迭代中很有通用性,我们应该要理解,万一不行强行记住也是有好处的。
 //递归回溯法
void Backtrack(int t)//形参t,第t行
{
 if(t>n)sum++;//如果t大于N,就没必要进行回溯了,这里是回溯法的边界条件,返回sum++,即N皇后的多种情况,做一个统计。
 else(int i=1;i<=n;i++)//还没到N行,那就进行循环 。直到查找所有列的情况

 x[t]=i;//,特别说明x[t]=i;很精巧啊,即循环查找到第t行第i列

 if(place(t))Backtrack(t+1);//如果第t行第i列满足条件,就回溯下一行,
}
}

 //迭代回溯法
void Backtrack
{
 x[1]=0;
 int k=1;
 while(k>0){
  x[k]+=1;
  while((x[k]<=n)&&!(place(k)))x[k]+=1;
  if(
   x[k]<=n)
   if(k==n)sum++;
   else{
    k++;
    x[k]=0;
   }
  else k--;
 }

}

 

迭代回溯法下回详细分解,今晚有点累了,还要做项目开发,主要是一些文档编写啦,好辛苦哦!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页