table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
1、尝试一个中等难度的数独谜题(可在网上或当地报纸上找到这类谜题),尝试不同的策略并记录结果。能否写出一个解决数独的通用方案?
解决数独的通用方案
首先,寻找数独中约束最多的部分,即可能取值最少的方格,理想情况是只有一个可能值的方格。
依据规则,每个数字在每行、每列和每个3×3区域中必须仅出现一次,通过已有的数字来确定这些方格的值。
先从这样的方格入手,填好数字后,再根据新填入的数字更新其他方格的可能取值。
持续寻找约束最多的方格进行填写,逐步完成整个数独。
2、找出一种与常规不同的滑动拼图策略。
可以采用分治法。以较大的滑动拼图为例,如 4×4 的 15 – 格拼图,先将 1 – 4 号瓷砖移到正确位置,剩下一个 3×4 的网格,接着移动最左列的瓷砖,剩下一个 3×3 的网格,此时问题就简化为一个 8 – 格拼图。即先解决一部分,把问题逐步简化成更小、更易解决的问题。
3、仅使用两条输出语句,一条输出井号,一条输出换行符,编写一个程序来生成以下形状:######## ###### ####
可以使用嵌套循环来解决此问题。外层循环控制行数,内层循环控制每行输出的井号数量。以下是示例代码:
#include <iostream>
int main() {
for (int row = 1; row <= 4; row++) {
for (int hashNum = 1; hashNum <= 10 - 2 * row; hashNum++) {
std::cout << "#";
}
std::cout << "
";
}
return 0;
}
4、自行设计一个由井号组成的对称图案,然后编写一个遵循该图案形状规则的程序来生成它。
自行思考对称的井号图案,再编写遵循形状规则的程序生成该图案。
5、编写一个程序,读取一行文本,统计单词数量,找出最长单词的长度、一个单词中最多的元音字母数量,以及你能想到的其他统计信息。
以下是一个Python示例程序来实现上述功能:
text = input("请输入一行文本:")
# 统计单词数量
words = text.split()
word_count = len(words)
# 找出最长单词的长度
longest_length = max(len(word) for word in words)
# 统计一个单词中最多的元音字母数量
vowels = 'aeiouAEIOU'
max_vowels = 0
for word in words:
vowel_count = sum(1 for char in word if char in vowels)
if vowel_count > max_vowels:
max_vowels = vowel_count
print(f"单词数量:{word_count}")
print(f"最长单词的长度:{longest_length}")
print(f"一个单词中最多的元音字母数量:{max_vowels}")
该程序首先读取用户输入的一行文本,然后使用
split()
方法将文本分割成单词列表。接着,它统计单词数量、找出最长单词的长度,并计算一个单词中最多的元音字母数量,最后将这些统计信息输出。
6、编写一个布尔型函数,该函数接收一个数组和数组中的元素数量作为参数,并判断数组中的数据是否已排序。这应该只需要遍历一次数组!
以下是一个满足要求的 C 语言函数示例:
#include <stdbool.h>
bool isSorted(int array[], int size) {
for (int i = 1; i < size; i++) {
if (array[i] < array[i - 1]) {
return false;
}
}
return true;
}
此函数会遍历数组,若发现相邻元素顺序不对(后一个元素小于前一个元素),就返回
false
,若整个遍历过程都未发现顺序问题,则返回
true
。
7、为了让密文问题更具挑战性,编写一个程序随机生成密码数组,而不是使用硬编码的常量数组。具体要求是在数组的每个元素中放置一个随机字符,且第一个元素不能是 A,同时不能对两次替换使用相同的字母,即如果第一个元素是 S,那么其他元素不能是 S。
该描述提出了一个编程任务,旨在增加密文问题的难度。具体要求是程序随机生成密码数组,而非使用预先设定的常量数组。在生成过程中,需遵循两个规则:
数组元素不能是其对应位置原本的字母(如第一个元素不能是 A);
数组中不能有重复的字母。
8、编写一个程序,处理一个学生对象数组,并确定成绩四分位数,即一个人需要达到的成绩,以便与25%、50%和75%的学生成绩一样好或更好。
以下是一个满足需求的Python示例代码:
class Student:
def __init__(self, name, id, grade):
self.name = name
self.id = id
self.grade = grade
# 示例学生列表
students = [
Student('Alice', 1, 85),
Student('Bob', 2, 90),
Student('Charlie', 3, 70),
Student('David', 4, 65),
Student('Eve', 5, 95),
Student('Frank', 6, 75),
Student('Grace', 7, 80),
Student('Heidi', 8, 60),
Student('Ivan', 9, 88),
Student('Judy', 10, 72)
]
# 提取所有学生的成绩
grades = [student.grade for student in students]
# 对成绩进行排序
grades.sort()
# 计算四分位数的索引
n = len(grades)
q1_index = int(0.25 * (n - 1))
q2_index = int(0.5 * (n - 1))
q3_index = int(0.75 * (n - 1))
# 获取四分位数
q1 = grades[q1_index]
q2 = grades[q2_index]
q3 = grades[q3_index]
print(f'25%的学生成绩低于或等于: {q1}')
print(f'50%的学生成绩低于或等于: {q2}')
print(f'75%的学生成绩低于或等于: {q3}')
上述代码定义了一个
Student
类,创建了一个学生对象列表,提取了所有学生的成绩并进行排序,然后计算了成绩的四分位数并输出结果。
9、让我们尝试使用基本框架来实现一个类。考虑一个用于存储汽车数据的类。我们将有三个数据项:制造商名称和型号名称,均为字符串类型,以及一个整数类型的车型年份。为每个数据成员创建一个带有获取/设置方法的类。确保你在成员名称等细节方面做出合理的决策。重要的是你要考虑所做的选择,并在决策上保持一致,而不是一定要遵循特定命名约定。
以下是实现该汽车类的代码示例:
#include <string>
class Automobile {
public:
Automobile();
Automobile(std::string newManufacturer, std::string newModel, int newYear);
std::string getManufacturer();
void setManufacturer(std::string newManufacturer);
std::string getModel();
void setModel(std::string newModel);
int getYear();
void setYear(int newYear);
private:
std::string _manufacturer;
std::string _model;
int _year;
};
注:原答案缺少必要的头文件包含,且
string
应使用
std::string
以符合标准 C++ 规范。
10、编写一个函数,接收一个链表和一个“目标”数字,返回目标数字在链表中出现的次数。要求先使用迭代方法解决,再使用递归方法解决。
可以先定义链表节点结构,然后分别用迭代和递归的方式遍历链表,统计目标数字出现的次数。
- **迭代方式**:通过循环遍历链表。
- **递归方式**:将链表分为头节点和剩余链表,递归处理剩余链表并结合头节点情况统计次数。
11、在编程中,“堆(heap)”这个术语除了指使用“new”进行内存分配的地方,还描述了一种二叉树,其中每个节点的值都高于其左子树或右子树中的任何值。请编写一个递归函数来判断一棵二叉树是否为堆。
以下是一个用Python实现的递归函数,用于判断一棵二叉树是否为堆:
class TreeNode:
def __init__(self, value=0, left=None, right=None):
self.value = value
self.left = left
self.right = right
def is_heap(root):
if root is None:
return True
# 检查左子树
left_valid = is_heap(root.left)
# 检查右子树
right_valid = is_heap(root.right)
# 检查当前节点的值是否大于左子节点和右子节点的值
left_cond = root.left is None or root.value > root.left.value
right_cond = root.right is None or root.value > root.right.value
return left_valid and right_valid and left_cond and right_cond
你可以使用以下代码测试这个函数:
# 构建一个示例二叉树
root = TreeNode(10)
root.left = TreeNode(5)
root.right = TreeNode(3)
root.left.left = TreeNode(1)
root.left.right = TreeNode(2)
# 判断是否为堆
print(is_heap(root)) # 输出: True
这个函数首先检查当前节点是否为空,如果为空则返回
True
。然后递归地检查左子树和右子树是否为堆。最后,检查当前节点的值是否大于左子节点和右子节点的值。如果所有条件都满足,则返回
True
,否则返回
False
。
12、编写一个递归函数,该函数接收二叉搜索树的根指针和一个要插入的新值,创建一个包含新值的新节点,并将其放置在正确的位置以维持二叉搜索树的结构。提示:考虑将根指针参数设为引用参数。
以下是一个满足需求的递归函数的示例代码:
#include <iostream>
// 定义二叉树节点结构
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 递归插入节点的函数
void insert(TreeNode*& root, int value) {
if (root == nullptr) {
root = new TreeNode(value);
return;
}
if (value < root->val) {
insert(root->left, value);
} else {
insert(root->right, value);
}
}
这个
insert
函数是递归的,它接收一个二叉搜索树的根指针(作为引用参数)和一个新值。如果根指针为空,就创建一个新节点。如果新值小于当前节点的值,就递归插入到左子树;否则,递归插入到右子树。
13、将绞刑架游戏图形化,在绞刑架搭建过程中实际显示绞刑架和被绞的人。不能用 ASCII 文本绘制绞刑架,可研究 C++ 的 2D 图形库,或者选择如 Flash 等更注重图形的平台来制作一个真正的图形程序。图形化的绞刑架可能需要限制错误猜测的次数,可至少为这个次数提供一个选择范围。
该要求旨在让开发者将绞刑架游戏从文字形式转变为图形化形式,要显示绞刑架和被绞的人。
不建议用 ASCII 文本绘制,可借助 C++ 的 2D 图形库或如 Flash 这类更适合图形开发的平台。
同时提到图形化可能需限制错误猜测次数,也可提供一定选择范围。
开发者应专注于编程实现而非画面艺术效果。
14、运用在猜单词游戏中所学的技能,去解决一个完全不同的、涉及操作单词列表的问题,设计一个新的使用单词的游戏。
可设计一个单词接龙游戏,程序有一个单词列表,玩家输入一个单词,程序从列表中选一个以该单词最后一个字母开头的单词接上,交替进行,若一方找不到合适单词则输。
还可设计一个单词填空游戏,程序从列表选单词,隐藏部分字母,玩家填空,程序根据列表判断对错。
15、搜索一个具有一定规模或难度的 C++ 编程问题,这个问题是你确定自己曾经认为以当时的技能无法解决的,然后去解决它。
此为一个练习要求,需用户自行搜索合适的 C++ 编程问题并尝试解决。