给一个在网上临摹大佬的一种用dfs来写这道题的代码,勿喷。
原代码视频链接
https://www.bilibili.com/video/BV1j24y1w7RR/?spm_id_from=333.880.my_history.page.click&vd_source=fe0be9f851003a3111d52a41ffcc724a
原代码视频链接
https://www.bilibili.com/video/BV1j24y1w7RR/?spm_id_from=333.880.my_history.page.click&vd_source=fe0be9f851003a3111d52a41ffcc724a
#include <iostream>
using namespace std;
int cnt, a[102];//确定数量以及输入数字
bool vis[20240000];//用于去重的判断数组
//判断该日期是否为合法日期
bool check(int data) {
if (vis[data])//判断该日期是否是重复日期
return false;
vis[data] = true;
int mm = data / 100 % 100;//取月份
int dd = data % 100;//取天数
if (mm < 1 || mm > 12)
//判断月份是否在1-12之间
return false;
if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12) {//判断大年
if (dd < 1 || dd > 31)
return false;
}
//判断2月特殊月份
else if (mm == 2) {
if (dd < 1 || dd > 28)
return false;
}
else if (dd < 1 || dd > 30)
return false;
else
return true;
}
//使用深搜来查找日期
void dfs(int x, int sum, int data) {
if (x == 100)
return;
if (sum == 8) {
if (check(data)) {
++cnt;
}
return;
}
if (//逐位排查
sum == 0 && a[x] == 2 ||
sum == 1 && a[x] == 0 ||
sum == 2 && a[x] == 2 ||
sum == 3 && a[x] == 3 ||
sum == 4 && a[x] >= 0 && a[x] <= 2 ||
sum == 5 && a[x] >= 0 && a[x] <= 9 ||
sum == 6 && a[x] >= 0 && a[x] <= 3 ||
sum == 7 && a[x] >= 0 && a[x] <= 9) {
dfs(x + 1, sum + 1, data * 10 + a[x]);
}
//这里千万不要用else,否则会导致提前出递归(调试半天才发现的问题)
dfs(x + 1, sum, data);
}
int main() {
for (int i = 0; i < 100; i++) {
cin >> a[i];
}
dfs(0, 0, 0);
cout << cnt;
return 0;
}
0 回复
0 转发
0 喜欢
0 阅读



