题目: https://vjudge.net/problem/UVA-712
思路
我想用题目中给出的第二组输入为例。
3
x3 x1 x2
00010011
4
000
010
111
110
000
可以看做二进制数000
,可以转化为十进制的0
,00010011
中的第0
位就是答案0
010
可以看做二进制数001
,可以转化为十进制的1
,00010011
中的第1
位就是答案0
111
可以看做二进制数111
,可以转化为十进制的7
,00010011
中的第7
位就是答案1
110
可以看做二进制数011
,可以转化为十进制的3
,00010011
中的第3
位就是答案1
所以,我们可以将所给的vva
转化为相应的二进制数,再转化为十进制数,最后从ch_arr
中输出相应位置上的数即可。
复杂之处在于如何将vva
转化成二进制数。
我创建了index
数组,用于储存下标。创建p数组,用于储存每个0/1
应该乘以2
的多少次幂。只要搞懂了p
数组是如何创建的,问题就迎刃而解了。
代码
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int index[10]; // 储存下标 例如 x1, x2, x3 储存为 1, 2, 3
int p[10]; // 储存指数
int n;
int kase = 0;
while (scanf("%d", &n)==1 && n)
{
printf("S-Tree #%d:\n", ++kase);
for (int i = 0; i < n; i++) {
string x; cin >> x; index[i] = x[1];
}
for (int i = 0; i < n; i++) {
p[index[i] - '0' - 1] = n - i - 1;
}
char ch_arr[1000];
scanf("%s", ch_arr);
int t; cin >> t;
while (t--)
{
string vva; cin >> vva;
int pos = 0;
for (int i = 0; i < n; i++) {
pos += (vva[i] - '0') * (1 << p[i]);
}
cout << ch_arr[pos];
}
cout << endl << endl;
}
return 0;
}