社区讨论

我这个为什么最起码一个点都过不了?

P5440【XR-2】奇迹参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2vmo4t
此快照首次捕获于
2023/10/23 20:31
2 年前
此快照最后确认于
2023/10/23 20:31
2 年前
查看原帖
各种情况都考虑了啊,就算复杂总不至于前几个全wa吧,题解的代码想结下来猜猜数据发现总是莫名其秒的不对。。。 写了好久了 情绪非常糟糕,特别沮丧,超级无语 难道是我题目理解出问题了吗? 拿01231222举例子,这不是123年的12月22日吗?判断日期合法,再判断1231222,1222,22这三个数字的合法性?难道不是这样吗? 我知道我的DFS内部有小问题,我可能出现重复的问题,我用了set暂时想规避这个问题,如果有大佬情愿指点迷津的话,麻烦赘述了。 救命,我的思路错在哪里了?
CPP
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int RN[]={0,31,29,31,30,31,30,31,30,31,30,31,30};
int PN[]={0,31,28,31,30,31,30,31,30,31,30,31,30};

int turntoint(string s){
    int ans=0;
    for (int i=0; i<s.length() ;i++) {
        ans=ans*10+(int)(s[i]-'0');
    }
    return ans;
}

bool CheckYear(int year){
    return (year%400==0&&year%100!=0||year%4==0);
}

bool date(string s){
    int year,month,day;
    string y,m,d;
    for (int i=0; i<4; i++) y=y+s[i];
    year=turntoint(y);
    for (int i=4; i<6; i++) m=m+s[i];
    month=turntoint(m);
    for (int i=6; i<8; i++) d=d+s[i];
    day=turntoint(d);
    if(year==0) return 0;
    if(month>=1&&month<=12&&day>=1){
        //1闰年
        if(CheckYear(year)){
            if(day>RN[month]) return 0;
            return 1;
        }
        //2平年
        else{
            if(day>PN[month]) return 0;
            return 1;
        }
    }
    return 0;
}

bool ss(int n){
    if(n==1) return 0;
    for (int i=2; i*i<=n; i++) {
        if(n%i==0) return 0;
    }
    return 1;
}

bool SS(string s){
    int year,month,day;
    string y,m,d;
    for (int i=0; i<8; i++) y=y+s[i];
    year=turntoint(y);
    for (int i=4; i<8; i++) m=m+s[i];
    month=turntoint(m);
    for (int i=6; i<8; i++) d=d+s[i];
    day=turntoint(d);
    return ss(year)&&ss(month)&&ss(day);
}

bool check(string s){
    return date(s)&&SS(s);
}

int ans;
set<string>ts;

void DFS(vector<int>&p,int step,string&s){
    if(step==(int)(p.size())){
        if(check(s)){
            ts.insert(s);
            ans++;}
        return;
    }
    for (int i=step; i<p.size(); i++) {
        for (int j=0; j<10; j++) {
            char c=(char)(j+'0');
            s[p[i]]=c;
            DFS( p, step+1, s);
        }
    }
    return;
}

int main(){
    int n;
    cin>>n;
    while (n--) {
        ans=0;
        string s;
        cin>>s;
        vector<int>p;
        for (int i=0; i<8; i++) {
            if(s[i]=='-') p.push_back(i);
        }
        DFS(p, 0, s);

        cout<<ts.size()<<endl;
    }
}

回复

2 条回复,欢迎继续交流。

正在加载回复...