题目描述
小浩今年拿到了国家奖学金,本来很高兴的事,可小浩却默默不乐,原来是不愿请大家吃饭,小浩查了一下银行卡,一看还有8位数,于是嘴角向上微翘,冷笑一声,说想让我请客,先能回答出我的问题来。小浩的问题是给定一个8位的正整数,如果能判断出这8位数是否能组成一个日期的年月日(年份范围0000~9999),就可以请客,同学们还等什么,加油啦!
输入
输入有多行,每行一个8位的正整数。
输出
对于输入的每个整数,如果能组合成一个日期,输出“yes”,否则,输出”no”,每个输出占一行。
样例输入
32872313
10000000
样例输出
yes
no
思路
其实就是全排列,枚举所有情况+判断。(就是这么暴力!)
惦记我。。。
- STL next_permutation
- DFS搜索
AC代码
- next_permutation
#include<iostream>
#include<string.h>
#include<algorithm>
#define N 100005
#define ll long long
using namespace std;
int a[N];
int d[N] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int judge (int year) {
if(year % 400 == 0 || (year % 100 && year % 4 == 0))
return 1;
else
return 0;
}
int main (){
//freopen("in.txt", "r", stdin);
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < 8; i++) {
a[i] = n % 10;
n /= 10;
}
sort(a, a + 8);
int flag = 0;
do {
int mon = a[5] + a[4] * 10;
int day = a[7] + a[6] * 10;
if (mon > 0 && mon <= 12 && day > 0 && day <= 31) {
int year = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
if(judge(year))
d[2] = 29;
else
d[2] = 28;
if (mon >= 1 && mon <= 12 && day >= 1 && day <= d[mon] ){
flag = 1;
break;
}
}
} while (next_permutation(a, a + 8));
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
- DFS
#include<iostream>
#include<string.h>
#include<algorithm>
#define N 100005
#define ll long long
using namespace std;
int vis[N], a[N], b[N], flag;
int d[N] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int judge (int year) { //判断闰年
if(year % 400 == 0 || (year % 100 && year % 4 == 0))
return 1;
else
return 0;
}
void dfs(int now) {
if (now == 9) {
int day = b[7] + b[6] * 10;
int mon = b[5] + b[4] * 10;
int year = b[0] * 1000 + b[1] * 100 + b[2] * 10 + b[3];
if (judge(year))
d[2] = 29;
else
d[2] = 28;
if (mon > 0 && mon <= 12 && day > 0 && day <= d[mon]) {
flag = 1;
return ;
}
}
for (int i = 0; i < 8; i++) {
if (vis[i] == 0) {
b[now] = a[i];
vis[i] = 1;
dfs(now + 1);
if (flag == 1)
return ;
vis[i] = 0;
}
}
}
int main (){
//freopen("in.txt", "r", stdin);
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < 8; i++) {
a[i] = n % 10;
n /= 10;
}
memset(vis, 0, sizeof(vis));
flag = 0;
dfs(1);
if (flag) {
printf("yes\n");
} else {
printf("no\n");
}
}
return 0;
}