部分代码来自其他博主,部分来自本人,仅作整理~
A.题目描述
已知一个无向图G的顶点和边,顶点从0依次编号,现在需要深度优先搜索,访问任一邻接顶点时编号小的顶点优先,请编程输出图G的深度优先搜索序列。
输入
第一行是整数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
code:
#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
code:
#include<bits/stdc++.h> using namespace std; void xgd(int b[],int k,int x) { b[0]=b[k]; for(int i=2*k;i<=x;i=i*2) { if(i<x&&b[i]>b[i+1]) { i++; } if(b[0]<=b[i]) break; else{ b[k]=b[i]; k=i; }} b[k]=b[0]; } void creat(int b[],int l) { for(int i=l/2;i>0;i--) { xgd(b,i,l); } } int main() { int n; cin>>n; int l=0; int a[n]; for(int i=1;i<=n;i++) { cin>>a[i]; } creat(a,n); for(int i=1;i<=n;i++) { cout<<a[i]<<" "; } }
C.题目描述
给你一个无重复数的有序序列,如果采用折半查找的方式,对于给定的数,需要比较几次找到,请编程实现。
输入
第一行是N,表示序列中数的个数,序列最长1000,第二行是一个有序序列,第三行是要找的数x。
输出
如果找到x,输出折半比较的次数,否则输出NO。
样例输入 复制
11 5 13 19 21 37 56 64 75 80 88 92 19
样例输出 复制
2
code:
#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<=100)。第二行是用空格隔开的N个数。
输出
排序输出N个数,每个数间用一个空格间隔。
样例输入 复制
5 9 6 8 7 5
样例输出 复制
5 6 7 8 9
code:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<int>vec; int n, m; cin >> n; for (int i = 0; i < n; i++) { cin >> m; vec.push_back(m); } sort(vec.begin(), vec.end(), less<int>()); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } }
E.题目描述
班级里有N个同学,老师希望你编个程序,把每个同学的学号、姓名、座位号保存下来,然后每次要查同学信息时,直接输入相应同学的学号,即可输出该同学的姓名和座位号。
输入
第一行为整数N(N<100),表示班里同学的人数。接下来N行,每行分别是每个同学的学号、姓名和座位号,最后一行是要查询的同学的学号。
输出
输出查询同学的姓名和座位号。
样例输入 复制
3 1 zhang 11 2 wang 22 3 li 33 2
样例输出 复制
wang 22
code:
#include<vector> #include<iostream> #include<algorithm> #include<string> using namespace std; struct stu { int learn_num; string name; int seat_num; }; int main() { vector<stu>vec; stu a; int n, learn_num, seat_num, index; string name; cin >> n; for (int i = 0; i < n; i++) { cin >> learn_num; a.learn_num = learn_num; cin >> name; a.name = name; cin >> seat_num; a.seat_num = seat_num; vec.push_back(a); } cin >> index; for (int i = 0; i < n; i++) { if (vec[i].learn_num == index) { cout << vec[i].name << " "; cout << vec[i].seat_num << endl; break; } } }