题解 Keep Distance

封面

题目传送门

思路:

题目要求求出所有的方案,考虑 dfs 找出每个方案。

利用深度优先搜索找出所有方案,遇到可能方案时存下来,并使我们用来记录一共有几个可能结果的变量加一,最后输出有几种可能和所有可能的方案。

注意 dfs 里要按从小到大的顺序搜。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int n,m;
int ans[15],cnt;
vector<int>anss;
void print(){
cnt++;
for(int i=1;i<=n;i++){
anss.push_back(ans[i]);
}
// anss+="\n";
return ;
}
void dfs(int now,int v){
// cout<<v
if(now==n+1){
print();return;
}
if(v>m)return;
for(int i=v;i<=m-(n-now)*10;i++)ans[now]=i,dfs(now+1,i+10);
return ;
}
int main(){
cin>>n>>m;
dfs(1,1);
cout<<cnt<<"\n";
for(int i=0;i<anss.size();i++){
cout<<anss[i]<<" ";
if(i%n==n-1)cout<<"\n";
}
return 0;
}

AC 记录