目录
问题 A: 无向图的深度优先搜索
输入
第一行是整数m和n(1<m,n<100),分别代表顶点数和边数。后边n行,每行2个数,分别表示一个边的两个顶点。
输出
该图从0号顶点开始的深度优先搜索序列。
样例输入 复制
5 5
0 1
2 0
1 3
1 4
4 2
样例输出 复制
0 1 3 4 2
#include<bits/stdc++.h> using namespace std; int mp[101][101]; bool f[101]={0}; int i,n,m; void dfs(int x) { cout<<x<<" "; for(int i=1;i<=m;i++) { if(mp[x][i]&&f[i]==0) { f[i]=1; dfs(i); } } } int main() { // int m,n; cin>>m>>n; int a,b; for(int i=1;i<=n;i++) { cin>>a>>b; mp[a][b]=1; mp[b][a]=1; } dfs(0); }
问题 B: 最小堆的形成
题目描述
现在给你n个结点的完全二叉树数组存储序列,请编程调整为最小堆,并输出相应最小堆的存储序列。
输入
第一行是n,第二行是n个结点的完全二叉树数组存储序列。
输出
输出相应最小堆的存储序列。
样例输入 复制
8
53 17 78 23 45 65 87 9
样例输出 复制
9 17 65 23 45 78 87 53
#include <iostream>
#include <vector>
using namespace std;
// 堆节点下沉操作
void downAdjust(vector<int>& arr, int parent, int length) {
int child = parent * 2 + 1; // 左孩子节点
while (child < length) {
if (child + 1 < length && arr[child + 1] < arr[child]) {
child++; // 选择左右节点中较小的一个
}
if (arr[parent] <= arr[child]) break;
swap(arr[parent], arr[child]);
parent = child;
child = parent * 2 + 1;
}
}
// 构建最小堆
void buildMinHeap(vector<int>& arr) {
for (int i = (arr.size() - 2) / 2; i >= 0; i--) {
downAdjust(arr, i, arr.size());
}
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
buildMinHeap(arr);
// 输出最小堆序列
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
return 0;
}
问题 C: 折半查找的次数
题目描述
给你一个无重复数的有序序列,如果采用折半查找的方式,对于给定的数,需要比较几次找到,请编程实现。
输入
第一行是N,表示序列中数的个数,序列最长1000,第二行是一个有序序列,第三行是要找的数x。
输出
如果找到x,输出折半比较的次数,否则输出NO。
样例输入 复制
11
5 13 19 21 37 56 64 75 80 88 92
19
样例输出 复制
2
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1001];
int f(int x)
{
int t=n,m=0,r=1,sum=0,f=0;
while(t>=r)
{
m=((t-r)/2)+r;
if(a[m]>x)
{
t=m-1;
if(t!=r)
sum++;
}
else if(a[m]<x){
r=m+1;
if(t!=r)
sum++;
}
else{
sum++;
return sum;
}
}
return -1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int x,p=0;
cin>>x;
p=f(x);
if(p==-1) cout<<"NO";
else cout<<p;
}
问题 D: N个数的排序
题目描述
给你N个自然数,编程输出排序后的这N个数。
输入
第一行是整数的个数N(N<=100)。第二行是用空格隔开的N个数。
输出
排序输出N个数,每个数间用一个空格间隔。
样例输入 复制
5
9 6 8 7 5
样例输出 复制
5 6 7 8 9
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a[100];
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //使用sort函数排序
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
问题 E: 班级同学信息查询
题目描述
班级里有N个同学,老师希望你编个程序,把每个同学的学号、姓名、座位号保存下来,然后每次要查同学信息时,直接输入相应同学的学号,即可输出该同学的姓名和座位号。
输入
第一行为整数N(N<100),表示班里同学的人数。接下来N行,每行分别是每个同学的学号、姓名和座位号,最后一行是要查询的同学的学号。
输出
输出查询同学的姓名和座位号。
样例输入 复制
3
1 zhang 11
2 wang 22
3 li 33
2
样例输出 复制
wang 22
#include <iostream>
#include <unordered_map>
using namespace std;
struct Student {
string name;
string seat;
};
int main() {
int n;
cin >> n;
unordered_map<int, Student> studentMap; // 使用unordered_map存储学生信息
for (int i = 0; i < n; i++) {
int id;
string name;
string seat;
cin >> id >> name >> seat;
studentMap[id] = {name, seat}; // 将学生信息存储到unordered_map中
}
int queryId;
cin >> queryId; // 输入要查询的学生学号
if (studentMap.count(queryId)) {
Student student = studentMap[queryId];
cout << student.name << " " << student.seat << endl;
} else {
cout << "学生不存在" << endl;
}
return 0;
}