2267: scholarship(dfs , STL)

带你飞!

题目描述

小浩今年拿到了国家奖学金,本来很高兴的事,可小浩却默默不乐,原来是不愿请大家吃饭,小浩查了一下银行卡,一看还有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; 
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/80087047
STL