题目
题目重述:给定一个数n,求一个长度为2n-1的序列:1只出现一次,2~n之间每个数出现2次,并且 对于2 ~n之间的每个数i,两个i之间相差为i,比如n=3,[3,1,2,3,2] ,两个3之间距离为3,两个2距离为2. 换言之,知道 第一个数i的下标x,第二个下标就确定了x+i。 要求满足条件的字典序最大的序列。
数据范围n≤20.
思路:想到暴搜
ac代码
class Solution {
public:
int n;
vector<bool>st; //1~n这些数是否用过
vector<int> path; //最终结果数组
//对于下标u,我能放什么
bool dfs(int u){
//退出条件
if(u==2*n-1) return true;
if(path[u]) return dfs(u+1);
//字典序最大,需要倒序遍历n~2,看看是否可以放在path[u] 和path[u+i]
for(int i=n;i>1;i--){
if(!st[i] && u+i <2*n-1&& !path[u+i]){
path[u]=path[u+i]=i;// 放上i
st[i]=true;//用过了
if(dfs(u+1)) return true;//如果有解,返回true
//恢复现场
st[i]=false;
path[u]=path[u+i]=0;
}
}
//特判1这个数
if(!st[1]){
st[1]=true;
path[u]=1;
if(dfs(u+1)) return true; //如果有解,返回true
//恢复现场
path[u]=0;
st[1]=false;
}
return false;
}
vector<int> constructDistancedSequence(int _n) {
n=_n;
st.resize(n+1,false); //都没访问过
path.resize(2*n-1);
dfs(0);
return path;
}
};