题目描述:
LSH去年买了个表,很神奇,是个二进制手表。如下图所示
例如,上面的二进制手表读取 “3:25”。
输入一个非负整数 n 代表当前 LED 亮着的数量,输出所有可能的时间。
结果按字典序排列
输入描述:
测试数据由多组测试样例组成。每组测试样例第一行输入一个整数 n ( 0 <= n <= 8 )
输出描述:
输出所有可能的时间组合
测试样例:
样例输入 1
1
样例输出 1
0:01
0:02
0:04
0:08
0:16
0:32
1:00
2:00
4:00
8:00
提示:
1.小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
2.分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。
3.输出顺序按照字典序从小到大排序
emmmm,菜鸡表示我这题是真的没有想明白,看到以往大佬的写法,于是决定写篇博客记录一下(出题人太强了),这题显示的小时和不能大于11,分钟和不能大于59,没有进位的情况,大概就是这样,建议看以往学长的博客,我的只是笨比写法
#include<bits/stdc++.h>
using namespace std;
set<string> se;
int hh[4] = {1, 2, 4, 8};
int mm[6] = {1, 2, 4, 8, 16, 32};
bool vish[4];
bool vism[6];
void dfs(int h, int m, int len, int n){
if(len == n){
string s = "";
string ss = "";
if(h == 0){
s += "0";
}
while(h){
ss += (h % 10) + '0';
h /= 10;
}
reverse(ss.begin(), ss.end());
s += ss;
s += ":";
ss = "";
if(m == 0){
s += "00";
}else if(m < 10){
s += "0";
s += m + '0';
}else{
while(m){
ss += (m % 10) + '0';
m /= 10;
}
reverse(ss.begin(), ss.end());
s += ss;
}
se.insert(s);
return ;
}
for(int i = 0; i < 6; i++){
if(vism[i]){
continue;
}
if(m + mm[i] > 59){
continue;
}
vism[i] = 1;
dfs(h, m + mm[i], len + 1, n);
vism[i] = 0;
}
for(int i = 0; i < 4; i++){
if(vish[i]){
continue;
}
if(h + hh[i] > 11){
continue;
}
vish[i] = 1;
dfs(h + hh[i], m, len + 1, n);
vish[i] = 0;
}
}
int main(){
int n;
while(cin >> n){
se.clear();
memset(vish, 0, sizeof(vish));
memset(vism, 0, sizeof(vism));
dfs(0, 0, 0, n);
for(auto i : se){
cout << i << endl;
}
}
return 0;
}