這個是在回溯法的標籤裏的。回溯法大致是這樣,按照深度優先搜索,在解空間樹裏往前走,如果不行就回退,然後換一條路。在換路的同時剪去錯枝,就是一種蠻力的有剪枝的遍歷......於是我先用的回溯:
class Solution {
public:
vector<string> readBinaryWatch(int num) {
vector<string> re;
vector<int> bit(10,1);
if(num==0)
{
re.push_back("0:00");
return re;
}
int deep=0;
int hour=0;
int minu=0;
int flag=0;
while(deep>=0)
{
if(flag==1) //flag=1是回溯的過程,在下面往下搜索的時候,改變deep和flag,flag決定回不回溯,deep是定位的,bit[deep]是標誌位。
{
if(bit[deep]==1)
{
if(deep<4)
hour-=pow(2,deep);
else
minu-=pow(2,deep-4);
bit[deep]=0;
num++;
if(deep==9) //最後一個是1還得回
{
flag=1;
continue;
}
else //如果不是最後一個且後面1的位置足夠,那麼還可以往下走,否則還要回
{
if(9-deep>=num)
{
deep++;
bit[deep]=1;
}
else
{
continue;
}
}
}
else if(bit[deep]==0) //如果回溯的時候這個位置標誌爲0,那麼這個位以下的情況都找遍了,還要往上回
{
bit[deep]=1;
--deep;
continue;
}
flag=0;
}
num--;
if(deep<4)
{
hour+=pow(2,deep);
if(hour>11)
{
flag=1;
continue;
}
else
{
deep++;
}
}
else if(deep<10)
{
minu+=pow(2,deep-4);
if(minu>59)
{
flag=1;
continue;
}
else
{
deep++;
}
}
else
{
deep--;
flag=1;
continue;
}
if(num==0)
{
deep--;
string temp;
stringstream ss;
ss<<hour;
ss>>temp;
temp+=":";
string mi;
ss.clear();
ss<<minu;
ss>>mi;
if(minu<10)
temp+="0";
temp+=mi;
re.push_back(temp);
flag=1;
}
}
return re;
}
};
然而可以不用回溯,直接遍歷所有的情況,這種情況是1的位數等於num的就塞進去......很簡單.....用到了bitset。bitset<>裏的是位數,後面的和別的容器意思差不多,()裏是初始化。
class Solution {
public:
vector<string> readBinaryWatch(int num) {
vector<string> rs;
for(int h=0;h<12;h++)
for(int m=0;m<60;m++)
{
if(bitset<10>(h<<6|m).count()==num)
{
rs.push_back(to_string(h)+(m<10?":0":":")+to_string(m));
}
}
return rs;
}
};