试题四(共 15 分)
阅读下列说明和 C 代码,回答问题 1 至 3,将解答写在答题纸的对应栏内
【说明】
n 皇后问题描述为:在一个 n*n 的棋盘上摆放 n 个皇后,要求任意两个皇后不能冲突, 即任意两个皇后不在同一行、同一列或者同一斜线上。
算法的基本思想如下:
将第 i 个皇后摆放在第 i 行,i 从 1 开始,每个皇后都从第 1 列开始尝试。尝试时判断 在该列摆放皇后是否与前面的皇后有冲突,如果没有冲突,则在该列摆放皇后,并考虑摆 放下一个皇后;如果有冲突,则考虑下一列。如果该行没有合适的位置,回溯到上一个皇后考虑在原来位置的下一个位置上继续尝试摆放皇后,……,直到找到所有合理摆放方案。
【C 代码】
下面是算法的 C 语言实现。
(1)常量和变量说明
n:皇后数,棋盘规模为n*n
queen[]:皇后摆放位置数组,queen[i]表示第i个皇后的位置,1<=queen[i]<=n
(2)C程序
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define n 4
/*
变量说明
n:皇后数,棋盘规模n*n
queen[]:皇后的摆放位置数组,queen[i]表示第i个皇后的位置,1<=queen[i]<=n
*/
int queen[n+1];
void Show(){ /* 输出所有皇后摆放方案 */
int i;
printf("(");
for(i=1;i<=n;i++){
printf(" %d",queen[i]);
}
printf(")\n");
}
int Place(int j){ /* 检查当前列能否放置皇后,不能放返回0,能放返回1 */
int i;
for(i=1;i<j;i++){ /* 检查与已摆放的皇后是否在同一列或者同一斜线上 */
if((queen[i]==queen[j]) || abs(queen[i]-queen[j]) == (j-i)) {//填空1
return 0;
}
}
return 1;//填空2
}
void Nqueen(int j){
int i;
for(i=1;i<=n;i++){
queen[j] = i;
if(Place(j)&&j<=n){//填空3
if(j == n) { /* 如果所有皇后都摆放好,则输出当前摆放方案 */
Show();
} else { /* 否则继续摆放下一个皇后 */
Nqueen(j+1);//填空4
}
}
}
}
int main(){
Nqueen(1);
return 0;
}
【问题 1】(8 分)
根据题干说明,填充 C 代码中的空(1)-(4)。
【问题 2】(3 分)
根据题干说明和 C 代码,算法采用的设计策略为 (5)
【问题3】(4分)
当n=4时,有 (6) 种摆放方式,分别为 (7) 。
试题五(JAVA)
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上留下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。现采用策略(Strategy)设计模式来实现该需求,所设计的类图如图5-1所示。
【Java 代码】
package test_2019_1;
import java.util.*;
interface BrakeBehavior {
public void stop(); //填空1
//其余代码省略
}
class LongWheelBrake implements BrakeBehavior {
public void stop() {
System.out.println("模拟长轮胎刹车痕迹! ");
}//其余代码省略
}
class ShortWheelBrake implements BrakeBehavior {
public void stop() {
System.out.println("模拟短轮胎刹车痕迹! ");
}//其余代码省略
}
abstract class Car {
protected BrakeBehavior wheel; //填空2
public void brake(){
wheel.stop();//填空3
}
//其余代码省略
}
class ShortWheelCar extends Car {
public ShortWheelCar(BrakeBehavior behavior) {
behavior.stop(); //填空4
}
//其余代码省略
}
public class STrategyTest {
public static void main(String[] args) {
BrakeBehavior brake = new ShortWheelBrake();
ShortWheelCar car1 = new ShortWheelCar(brake);
car1.brake(); //填空5
}
}
//模拟短轮胎刹车痕迹!