题目
现有两个按钮,按下按钮0会执行2x+1,按下1执行2x+2。x初值为0,现要求出任意正整数n应使用何种按法使得x能变成n。
遍历
打眼一看这题就是遍历啊,找所有解法,但是不同于别的简单题,需要你有一个顺序去遍历。递归呗。使用深度优先搜索。
具体如下。
#include<stdio.h>
#include<stdlib.h>
int success;
int max(int s){
int n = 0;
int t = 0;
while(t<s){
t = t*2+1;
n++;
}
return n;
}
void print(int arr[],int now){
int i;
for(i = 0;i<now;i++){
printf("%d ",arr[i]);
}
puts("");
}
void do_sth(int arr[],int now,int t,int m,int type){
//arr[]保存路径的数组
//now 当前步数
//t当前结果
//m目标值
//type 当前算法
if(success == 1){
return ;
}
if(t > m){
return;
}
arr[now] = type;
int new_t;
if(type==0){
new_t = t*2 + 1;
}else{
new_t = t*2 + 2;
}
if(new_t == m){
success = 1;
print(arr,now+1);
return;
}else{
do_sth(arr,now+1,new_t,m,0);
do_sth(arr,now+1,new_t,m,1);
}
}
int main(void){
success = 0;
int n;
int t;
int *arr;
while(scanf("%d",&n) != EOF){
success = 0;
t = max(n);
arr = malloc(sizeof(int)*t);
do_sth(arr,0,0,n,0);
do_sth(arr,0,0,n,1);
free(arr);
}
}
逆向求解
因为这道题每个要求解的数的答案都是固定的,dfs遍历太耗费时间。实际可以通过以下方法求解。
1. n大于0吗?是——>2。否——>逆序输出结果
2. n是奇数吗?是——>3。否——>4
3. n=(n-1)/2 记录按钮0 ——>1
4. n=(n-2)/2 记录按钮1 ——>1
python代码
#! /usr/bin/env python3
def solve(n):
s = []
while(n>0):
if(n % 2 == 1):
n = (n-1)/2
s.append(0)
else:
n = (n-2)/2
s.append(1)
for i in s:
print('{} '.format(i),end='')
print("")
try:
while True:
s = int(input())
solve(s)
except EOFError:
pass