题目
输入
5
4 2
3 4
10 1
2 2
8 128
思路
因为这个树是满二叉树并且不会删除插入,我们使用顺序存储结构来储存这个数,这样子 结点的左孩子就是对应结点下标index的两倍,右孩子就是对应下标两倍+1即 2 * index + 1
每次访问的时候改一下他的bool值即可
代码
#include<bits/stdc++.h>
using namespace std;
struct dot
{
bool dir = false;
};
int power(int p, int b = 2)
{
if(p == 0) return 1;
else
{
int k = 1;
for(int i = 0; i < p; i++)
k *= b;
return k;
}
}
int main()
{
int n;
cin >> n;
for(int t = 0; t < n; t++)
{
int height, times;
cin >> height >> times;
dot* root = new dot[power(height)];
for(int i = 0; i < times; i++)
{
int root_num = 1;
for(int j = 0; j < height - 1; j++)//叶子节点不用移动了
{
bool temp = root[root_num - 1].dir;
root[root_num - 1].dir = !root[root_num - 1].dir;
root_num *= 2;
if(temp == true)
{
root_num++;
}
}
if(i == times - 1)
cout << root_num << endl;
}
delete[] root;
}
}