返回题解分享
讨论 / 题解分享/ 帖子详情

日期统计(结果填空) - 题解

给一个在网上临摹大佬的一种用dfs来写这道题的代码,勿喷。
原代码视频链接
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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!