人生的第一篇博客
写在大三路上-对编程的看法(一)
我是一名大三学生,现在已经学习了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--;
}
}
迭代回溯法下回详细分解,今晚有点累了,还要做项目开发,主要是一些文档编写啦,好辛苦哦!