Files
python/RuMenJingDian/UVa/UVa213.cpp

82 lines
2.5 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#include <bits/stdc++.h>
//阅读材料:https://blog.csdn.net/mrcrack/article/details/52122765
/**
* C语言中1<<i表示将1的二进制每位想左移动i位,末位补0。
左移运算符(<<)是C语言中的一种常见的运算符,一般用法可以通过下面的例子讲解来说明:
如:1<<5 由于1的二进制为0000 0001,左移5位就是将每位向左移动5位,末位补0,所以1<<5后结果为0010 0000,转换为十进制就是32。
*/
char codes[8][1 << 8];
//1左移8位,表示100000000-->二进制->转十进制--> 256 这挺会玩啊~这么做也对,因为既然要把这道题考虑成二进制,
// 那么出现的组合个数按左移N位来思考,也是正常的
//读取一个有用字符,小函数,辅助函数
int readchar() {
char ch;
while (true) {
//读啊读~回车换行符不要,
ch = getchar();
if (ch != '\r' && ch != '\n')
return ch;
}
}
//读取代码
int readcodes() {
int len;
int i;
char ch;
//清空codes数组,初始化为0
memset(codes, 0, sizeof(codes));
//读入第一个非换行的字符
codes[1][0] = readchar();
//从第2个开始,使用getchar进行读取
for (len = 2; len <= 7; len++) //7是极限,表示不会超过7位二进制
//第一轮次,读取字符
for (i = 0; i < (1 << len) - 1; i++) {
ch = getchar();
//结束就不用继续了~
if (ch == EOF)
return 0;
//如果是换行符,就继续下一轮
if (ch == '\n')
return 1;
//读取到指定位置
codes[len][i] = ch;
}
return 1;
}
//读取二进制数字,转为十进制数,比如读取c=3个长度,封装成十进制数
int readint(int c) {
int v = 0;
while (c--) {
v = v * 2 + readchar() - '0';
}
return v;
}
int main() {
int len;
int i;
//读取代码,不断的读取测试用例
while (readcodes()) {
//在一个用例中开始进行分析
while (true) {
len = readint(3);
if (len == 0)
break;
while (true) {
i = readint(len);
if (i == (1 << len) - 1)
break;
putchar(codes[len][i]);
}
}
putchar('\n');
}
return 0;
}