8-10 DAIRY

【补昨天的】
昨天爆0了…但是这还真不是我不发博客的原因。
昨天的题没有多少难度区别,基本上都是基于某一(些)算法加一些改编而成,所以连暴力都是费用流,我,还真不会写QAQ….
不过没啥,不会再学(吧…..就是现在还没学,我感觉我还有好多更简单的知识要补所以先打好之前的基础吧

废话这么多,我考试时的心路历程也不太记得了,似乎也没有出现什么要记录的错误,然后也没摸到这场考试的风。下午的讲题我自然是跟不上什么“只要一个裸的费用流就可以30分了”(尬

做题 20:00 - 22:00 改了两个小时虫食算,之前写的真的很丑陋,错的不止那个0~9…
一开始输入的处理也是错的,一个是字符串输入(我一个个字符输入)忽略了行末换行字符。暴露出的问题:【字符串的输入处理注意空格、换行等问题】另一个是按顺序存字母,写出来的代码存进去的和想的不一样(笑哭)。可能还改了其他小地方但是今天不记得了。。

真是想了我好久改了好多方法才想出一个按正确顺序存字母的办法…DFS暂时还没改完,我发现回溯部分有些问题,这也是我的一个通病,问题:【很多题DFS的回溯想不清】
差不多了,是在记不起还要写什么了,我先去写T2和复习知识点吧。
还在改中,先贴一个现在的代码:

#include<bits/stdc++.h>
#include<cstdio>

using namespace std;

int n, tmp, tmp_next;
char s1[30], s2[30], s3[30];
struct node{
    char ch;
    int num;//字母对应的数字
}s[90];
char numb[15];//数字对应的字母

int pp(int number, int charr){
    if(numb[number]) return 1;
    return 0;
}

int checknum(int m){//数字是否匹配字母
    if(numb[m] >= 'A' && numb[m] <= 'Z') return 1;
    return 0;
}

int checkchar(node letter){
    if(letter.num >= 0 && letter.num <= n) return 1;
    return 0;
}

void pp(node letter, int m){
    letter.num = m;
    numb[m] = letter.ch;
}

void failpp(node letter, int m){
    letter.num = 30;
    numb[m] = ' ';
}

void dfs(int now){
    if(now % 3 == 2){
        if(now == (3*n-1)){
            if(tmp_next != 0) return;
        }
        tmp = s[now-1].num + s[now-2].num;
        tmp_next = tmp - n;
        if(checkchar(s[now])){
            if(s[now].num != ((tmp + tmp_next) % n)) return;
            else{
                tmp_next = (tmp + tmp_next)/n;
                dfs(now+1);
                failpp(s[now], (tmp + tmp_next) % n);
            }
        }
        else{
            if(checknum((tmp+tmp_next)%n)) return;
            tmp_next = tmp / n;
            pp(s[now], (tmp + tmp_next) % n);
            dfs(now+1);
            failpp(s[now], s[now].num);
        }

    }
    if(now % 3 == 1 || now % 3 == 0){
        if(!(checkchar(s[now]))){
            for(int i = 0; i < n; i++){
                if(!(checknum(i))){
                    s[now].num = i;
                    numb[i] = s[now].ch;
                }
            }
        }
        dfs(now+1);
        failpp(s[now], s[now].num);
    }
}

bool cmp(node x, node y){
    return (x.ch - '0') < (y.ch - '0');
}

int main(){
    freopen("p1092.in", "r", stdin);
    freopen("p1092.out","w",stdout);

    scanf("%d", &n);

    for(int i = 0; i <= 9; i++) numb[i] = ' ';

    char ss[90];

    int j = 0;
    scanf("%s", s1);
    for(int i = n-1; i >= 0; i--){
//      scanf("%c", &s1[i]);
        s[3 * j].ch = s1[i];
        s[3 * j].num = 30;
        j++;
    }

    j = 0;
    scanf("%s", s2);
    for(int i = n-1; i >= 0; i--){
//      scanf("%c", &s2[i]);
        s[3 * j + 1].ch = s2[i];
        s[3 * j + 1].num = 30;
        j++;
    }

    j = 0;
    scanf("%s", s3);
    for(int i = n-1; i >= 0; i--){
//      scanf("%c", &s3[i]);
        s[3 * j + 2].ch = s3[i];
        s[3 * j + 2].num = 30;
        j++;
    }

/*  for(int i = 0; i < 3 * n; i++){
        s[3*n-i-1].ch = ss[i];
    }
*/
    for(int i = 0; i < 3 * n; i++) printf("%c ", s[i].ch);
    printf("\n");

    tmp = 0;
    dfs(0);

    sort(s, s+(3 * n)-1, cmp);

    int t = 0;
    printf("%c %d\n", s[t].ch, s[t].num);
    for(int i = 1; i < n*3; i++){
//      if(s[i].num != s[t].num){
            t = i;
            printf("%c %d\n", s[t].ch, s[t].num);
//      }
    }

    return 0;               
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值