(1)
#include
using namespace std;
int main()
{
int a[][3] = {1, 2, 3, 4, 5, 6};
//ptr是一个指向有三个int元素的数组,ptr++是以3*sizeof(int)为单位
int (*ptr)[3] = a;
printf("%d%d\n", (*ptr)[1], (*ptr)[2]);
printf("%p, %p, %p\n", ptr, &a[0][0], a);
++ptr;
printf("%d%d\n", (*ptr)[1], (*ptr)[2]);
printf("%p, %p, %d, %d\n", ptr, &a[1][0], ptr-a, &a[1][0]-&a[0][0]);
return 0;
}
输出
23
0x7fff29f6fca0, 0x7fff29f6fca0, 0x7fff29f6fca0
56
0x7fff29f6fcac, 0x7fff29f6fcac, 1, 3
(2)
#include
using namespace std;
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int * p[5];
// int* ref[5] = {1, 2, 3, 4, 5}; //编译出错
int (*p1)[5] = &arr;
int (&p2)[5] = arr;
printf("%d, %d, %d\n", (*p1)[1], p2[2], p1[0][2]);
// 一下三个值相等
printf("%p, %p, %p", *p1, arr, p1);
return 0;
}
输出:
2, 3, 3
0x7ffdb545d940, 0x7ffdb545d940, 0x7ffdb545d940
(3)
#include
using namespace std;
class A {
public:
A(){cout << "A()" << endl;}
A(int a){cout << "A(int)" << endl;}
A(int a, int b){cout << "A(int,int)" << endl;}
};
class B:public A{
public:
B(){cout << "B()" << endl;}
using A::A;
};
int main()
{
B b();
B c(1);
B d(1, 2);
return 0;
}
输出:
A(int)
A(int,int)
(4) 输入n,m,n表示点的个数,m表示查询次数,接下来n-1个点,p2,p3,p4....pn,表示节点 i 的父节点是pi,根节点编号为1,例如输入
3 3
1 1
1 2 3
表示总共3个结点,查询三次,节点2的父节点是1,节点3的父节点是1,对于每次的查询,输出这个点到其他所有点的距离之和,
1
/ \
2 3 查询节点1,则1到2的距离是1,1到3的距离是1,最终结果是2;
查询节点2,则2到1的距离是1,2到3的距离是2,最终结果是3;
查询节点3,则3到1的距离是1,3到1的距离是2,最终结果是3;
#include
#include
#include
using namespace std;
void dfs(vector>& grid, int cur, set& node, int depth, int& sum, int n) {
if (node.find(cur) == node.end()) {
sum += depth;
node.insert(cur);
}
for (int i = 1; i <= n; i++) {
if (node.find(i) == node.end() && grid[cur][i] == 1) {
dfs(grid, i, node, depth+1, sum, n);
}
}
}
int main() {
int n, m;
while (cin >> n >> m) {
int t;
vector> grid(n+1, vector(n+1, 0));
for (int i = 2; i <= n; i++) {
cin >> t;
grid[i][t] = 1;
grid[t][i] = 1;
}
vector ans;
for (int i = 0; i < m; i++) {
cin >> t;
set set_node;
int sum = 0;
dfs(grid, t, set_node, 0, sum, n);
ans.push_back(sum);
}
for (int i = 0; i < m; i++) {
cout << ans[i] << " ";
}
cout << endl;
}
return 0;
}
(5)输入四个数,n,a,b,c,n表示最多可以进行的操作次数,第 i 次的操作定义为如下:从a,b,c中选取一个严格大于 i 的数字,将其值减去 i ,被剪掉的部分不参与后期的计算,剩下的部分组成新的a,b,c,问a,b,c可以组成多少种面积大于零的三角形。例如如下:
输入5 3 4 5
输出10
(1,4,4) (2,2,2) (2,4,3) (2,4,5) (3,2,4) (3,3,3) (3,3,5) (3,4,2) (3,4,4) (3,4,5) 10种
解释:最多可以进行5次操作,第一次操作将5变成5-1=4,则(3,4,4)可以组成三角形,第二次操作可以将3变成3-2=1,则(1,4,4)可以组成三角形。以此类推。
#include
#include
#include
#include
using namespace std;
bool check(vector& nums) {
if (nums[0] + nums[1] > nums[2] && nums[1] + nums[2] > nums[0] && nums[2] + nums[0] > nums[1]) {
return true;
}
return false;
}
void backtrace(vector nums, int op, set& set_str, int max_op) {
if (op > max_op) {
return;
}
if (check(nums)) {
string nums_str = to_string(nums[0]);
for (int k = 1; k < 3; k++) {
nums_str += "-";
nums_str += to_string(nums[k]);
}
set_str.insert(nums_str);
}
for (int i = 0; i < 3; i++) {
vector t = nums;
if (t[i] > op) {
t[i] = t[i] - op;
backtrace(t, op+1, set_str, max_op);
}
}
}
int main() {
int n, a, b, c;
while (cin >> n >> a >> b >> c) {
vector nums{a, b, c};
set set_str;
backtrace(nums, 0, set_str, n);
for (auto it = set_str.begin(); it != set_str.end(); it++) {
cout << *it << " ";
}
cout << set_str.size() << endl;
}
return 0;
}