C++回溯
文章目录
- C++回溯
- 1、回溯常见模板
- 2、取每位数的模
- 3、回文日期
1、回溯常见模板
/*回溯法模板def func():if 满足条件:return resultfor range 选择列表:选择func()撤销选择
*/
代码示例:1.求1~n的全排列并打印出来。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+5;
int n;
int a[N],vis[N];
void dfs(int dep){if(dep==n+1){for(int i=1;i<=n;i++){cout<<a[i]<<" \n"[i==n];}return;}for(int i=1;i<=n;i++){if(vis[i])continue;vis[i]=1;//a[dep]=i;dfs(dep+1);vis[i]=0;//}}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n;dfs(1);return 0;
}
也可以使用库函数next_permutaition():
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+5;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n;cin>>n;vector<int> a(n);for(int i=1;i<=n;i++){a[i-1]=i;}do{for(int i=0;i<n;i++)cout<<a[i]<<" \n"[i==n-1];}while(next_permutation(a.begin(),a.end())); return 0;
}
2、取每位数的模
def isNmp:while(x):t=x%10;if 正确return truex/=10;
return false
3、回文日期
-
int year = j % 10 * 1000 + (j / 10) * 100 + i % 10 * 10 + i / 10;
- 这行代码是将给定的月份
i
和天数j
转换为一个四位数的年份。类似于之前,j
被分成十位和个位,然后乘以相应的权重,而i
也类似地处理,确保每个数字都在正确的位置上。最后,将它们加起来形成一个四位数的年份。
- 这行代码是将给定的月份
-
int sum = year * 10000 + i * 100 + j;
- 这行代码是将年份、月份和日期合并成一个整数表示一个完整的日期。年份乘以 10000 是为了把它移到正确的位置,月份乘以 100 是为了把它移到正确的位置,最后把日期直接加到末尾即可。
#include<bits/stdc++.h>
using namespace std;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);// 1 2 3 4 5 6 7 8 9 10 11 12 // 31 31 30 31 30 31 31 30 31 30 31// 判断2月是否是闰年 => return x%400==0 || (x%4==0 && x%100!=0)// 闰年 29天 ,平年 28天int y[]={0,31,29,31,30,31,30,31,31,30,31,30,31};int n,m;cin>>n>>m;int ans=0;for(int i=1;i<=12;i++){for(int j=1;j<=y[i];j++){int year=j%10*1000+(j/10)*100+i%10*10+i/10;int sum=year*10000+i*100+j;if(sum>m||sum<n)continue;else ans++;}}cout<<ans;return 0;
}