问题描述:
A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).
Each LED represents a zero or one, with the least significant bit on the right.
For example, the above binary watch reads “3:25”.
Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.
Example:
Input: n = 1
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
Note:
The order of output does not matter.
The hour must not contain a leading zero, for example “01:00” is not valid, it should be “1:00”.
The minute must be consist of two digits and may contain a leading zero, for example “10:2” is not valid, it should be “10:02”.
问题思路:
首先给出n个灯亮,就是从表示时的灯和表示分的灯中选出n个灯,并且将他们的值表示出来
使用树的深搜就可以完成,本题中笔者建立了一个a[10]用来储存4个时灯和6个分灯的情况,进行遍历,并且在进行了减枝。
注意
需要注意题目的边界条件 0<h<11 0<m<59
笔者在此一开始没注意到导致错误。
附上AC代码:
class Solution {
public:
vector<string>res;
vector<string> readBinaryWatch(int num) {
int h[10]={0};
get(h,10,num,0);
cout<<res.size();
sort(res.begin(),res.end());
return res;
}
void get(int a[],int n,int time,int k){
if(k==n||time==0){
if(time==0){
for(int i=k;i<n;i++){
a[i]=0;
}
}
int hsum=0;
int msum=0;
for(int i=0;i<6;i++){
msum +=a[i]*pow(2,i);
}
for(int i=6;i<10;i++){
hsum +=a[i]*pow(2,i-6);
}
if(hsum>11||msum>59){return ;}
string sh;
if(msum>=10)
sh =to_string(hsum)+":"+to_string(msum);
else
sh =to_string(hsum)+":0"+to_string(msum);
//cout<<sh<<endl;
res.push_back(sh);
return ;
}
else{
if(time>0){
a[k]=1;
get(a,n,time-1,k+1);
if(n-k>time){
a[k]=0;
get(a,n,time,k+1);}
}else{
a[k]=0;
get(a,n,time,k+1);
}
}
}
void clear(int a[],int n){
for(int i=0;i<n;i++){
a[i]=0;
}
}
};