题解:AT_utpc2012_01 2012年12月02日

· · 题解

题目大意

以 yyyy/mm/dd 的格式输入一个日期(其中 y 是年,m 是月,d 是日,可能有前导 0),判断月份和日期的数字(包含前导 0)重新排列后是否可以组成年的数字。

举例:2005 年 05 月 20 日,月份和日期组成的数字为 0520,经过重新排列后可以得到 2005。

解题思路

为方便处理,可以采用字符串存储年月日。\ 考虑定义一个字符串 st 来存储月份和日期,然后从小到大求出 st 的所有排列,然后与年份比对即可。

代码实现

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string y, m, d;
    getline(cin, y, '/'); // 按照题目要求输入(getline 函数具体用法见文末)
    getline(cin, m, '/');
    cin >> d;

    string st = m + d; // 把月份和日期合成一个字符串
    sort(st.begin(), st.end()); // 排序后得到最小的排列

    bool p = 0; // 用于标记是否是“好日子”
    do { // 一定要用 do_while,用 while 会忽略最小的排列
        if (st == y) { // 判断是否可以组成年份
            p = 1;
            break;
        }
    } while (next_permutation(st.begin(), st.end())); // next_permutation 函数求下一个全排列(具体用法见文末)

    if (p)
        printf("yes\n"); // 判断并输出
    else
        printf("no\n");
    return 0;
}

总结

备注