范文无忧网面试笔试面试回答

程序员递归面试问题及解析

03月27日 编辑 fanwen51.com

[程序员面试攻略]一、入门级程序员的面试题:这些软件设计和设计模式的先关问题大多会出现在初学者面试情景中,什么是设计模式?特定的设计模式又是什么?等等这些概念,也许你很轻易回答这些概念,但文...+阅读

面试例题 2:八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是 19 世纪著名的数学家高斯 1850 年提出:在 88 格的国际象棋盘上摆放 8 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。[英国某著名计算机图形图像公司面试题]

解析:递归实现 n 皇后问题。

算法分析:

数组 a、b、c 分别用来标记冲突,a 数组代表列冲突,从 a[0]~a[7]代表第 0 列到第 7 列。如果某列上已经有皇后,则为 1,否则为 0。

数组 b 代表主对角线冲突,为 b[i-j+7],即从 b[0]~b[14]。如果某条主对角线上已经有皇后,则为 1,否则为 0。

数组 c 代表从对角线冲突,为 c[i+j],即从 c[0]~c[14]。如果某条从对角线上已经有皇后,则为 1,否则为 0。

代码如下:

#include stdio.h

static char Queen[8][8];

static int a[8];

static int b[15];

static int c[15];

static int iQueenNum=0; 记录总的棋盘状态数

void qu(int i);

参数i 代表行

int main()

{

int iLine,iColumn;

棋盘初始化,空格为*,放置皇后的地方为#

for(iLine=0;iLine8;iLine++)

{

a[iLine]=0; 列标记初始化,表示无列冲突

for(iColumn=0;iColumn8;iColumn++)

Queen[iLine][iColumn]=*;

}

主、从对角线标记初始化,表示没有冲突

for(iLine=0;iLine15;iLine++)

b[iLine]=c[iLine]=0;

qu(0);

return 0;

}

void qu(int i)

{

int iColumn;

for(iColumn=0;iColumn8;iColumn++)

{

if(a[iColumn]==0b[i-iColumn+7]==0c[i+iColumn]==0)

如果无冲突

{

Queen[i][iColumn]=#;

放皇后

a[iColumn]=1;

标记,下一次该列上不能放皇后

b[i-iColumn+7]=1;

标记,下一次该主对角线上不能放皇后

c[i+iColumn]=1;

标记,下一次该从对角线上不能放皇后

if(i7) qu(i+1);

如果行还没有遍历完,进入下一行

else 否则输出

{

输出棋盘状态

int iLine,iColumn;

printf(第%d 种状态为:\n,++iQueenNum);

for(iLine=0;iLine8;iLine++)

{

for(iColumn=0;iColumn8;iColumn++)

printf(%c ,Queen[iLine][iColumn]);

printf(\n);

}

printf(\n\n);

}

如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置

Queen[i][iColumn]=*;

a[iColumn]=0;

b[i-iColumn+7]=0;

c[i+iColumn]=0;

}

}

}

延伸阅读:

php程序员面试题请列举你能想到的UNIX信号,并说明信号用途。 请列举、你能想到的所有的字符串查找算法,并加注释简单说明。 有一个IP地址(192.168.0.1),请写出其32位无符号整数形式。 写出、你...

java程序员面试自我介绍技巧ja程序员应试者应充分利用各种个人资源。想了解ja程序员面试指南?除了前面提到的应试者面带微笑、目光交流、坐姿端正等表情、身体语言外,请以沉稳平静的声音、以中等语速、...

程序员面试经验分享4月初离职到现在差不多大半月的时间,终于找到工作了,待遇和我理想的12K左右差不多,最终在14K的样子。用到终于这个词,大家也能猜到这次的求职并不太顺利。总结下吧,算是给各位还...

Java程序员面试常见的10道XML面试题问题1:XML是什么?答:XML即可扩展标记语言(Extensible Markup language),你可以根据自己的需要扩展XML。XML中可以轻松定义, 等自定义标签,而在HTML等其他标记语言中必须使用预定...

程序员面试问题.程序员面试问题分享1. new 关键字用法(1)new 运算符用于创建对象和调用构造函数。(2)new 修饰符用于向基类成员隐藏继承成员。(3)new 约束用于在泛型声明中约束可能用作类...

程序员面试宝典——面试注意事项面谈的时候,要与面试官保持目光接触,显示出你的友好、真诚、自信和果断。如果你不与对方保持目光接触,或者习惯性地瞟着左上角或者右上角的话,会传达给对方你对目前话题表现冷淡...

Java程序员面试宝典面试例题1:对象与实例有什么区别? 解析:在Ja的内存分配中,对象和实例是不同的,前者分配在内存堆里,后者分配在堆栈里,至于为什么要这样分,参考一下其他的资料。对象是不变的东西,它...

java程序员面试自我介绍自我介绍是向别人展示你自我介绍好不好。下面是ja程序员面试自我介绍,一起来看一下吧。 ja程序员面试自我介绍 ja程序员应试者应充分利用各种个人资源。想了解ja程序员面试指...

程序员面试宝典——笔试环节笔试是程序员面试3个过程中最重要的一个环节,也是最难以提升的一个环节。不论你有多么大的才干,多么广博的知识,如果未能通过笔试,则无缘下面的进程。下面是一个表,描述了各种IT...

推荐阅读
图文推荐
栏目列表