题目描述:
https://leetcode-cn.com/problems/binary-watch/
题目过长,就不多描述了,直接点链接即可。
思路:列举m个小时灯亮,n个分钟灯亮的情况下的各种小时和分钟的值,并且排列组合即可。(m+n==num)
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
/*
这个函数是用来列举num个小时灯亮的情况下的小时的值或num个分钟灯亮的情况下分钟的值
arr:存放二进制数
length:数组长度
list:存放列举出的加数和
num:加数的个数
limit:数相加最大值
sum:所取的数相加之和
times:第几次取数
*/
void Permutation(int arr[],int length,vector<int>& list,int num,int limit,int start,int sum,int times)
{
if(times==num)
{
list.push_back(sum);
return;
}
else
{
for(int i=start;i<length;++i)
{
if(arr[i]+sum<=limit)
Permutation(arr,length,list,num,limit,i+1,sum+arr[i],times+1);
}
}
}
vector<string> readBinaryWatch(int num)
{
vector<string> result;
//小时灯最多亮三个,分钟灯最多亮五个
if(num>8)
return result;
vector<int> hours;
vector<int> minutes;
int hour[] = {1,2,4,8};
int minute[] = {1,2,4,8,16,32};
//小时不可能是四个数相加,四个数相加就会超过11
int count = num<=3?num:3;
for(int i=0;i<=count;++i)
{
if(num-i<6)
{
//列举出所有可能的小时和分钟
Permutation(hour,4,hours,i,11,0,0,0);
Permutation(minute,6,minutes,num-i,59,0,0,0);
//组合所列举出的小时和分钟,并放入结果集
for(int j=0;j<hours.size();++j)
for(int k=0;k<minutes.size();++k)
{
string str,str1,str2;
//将int转化为string
stringstream ss;
ss<<hours[j];
ss>>str1;
ss.clear();
ss<<minutes[k];
ss>>str2;
str = str1+(minutes[k]<10?":0":":")+str2;
result.push_back(str);
}
hours.clear();
minutes.clear();
}
}
return result;
}
int main(){
int num = 3;
vector<string> result = readBinaryWatch(num);
for(int i=0;i<result.size();++i)
printf("%s\n",result[i].c_str());
return 0;
}