【补昨天的】
昨天爆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;
}