问题描述
附件 prog.txt 中是一个用某种语言写的程序。
其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,
从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。
例如如下片段:
该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题解:
原题中给的txt自己去网上搜,一共是1001行,最终答案为241830 思路:
每一个第0列的REPEAT内部分三种情况,第一种情况,REPEAT的R正下方对应的A,第二种情况,REPEAT中嵌套一个REPEAT,依次循环下去,第三种情况,REPEAT下面的A没有与R正对应,而是错开了一部分,最后把所有并列的位于第0列的
REPEAT的结果加起来。本题有很多坑,比如每一个第0列的REPEAT结束行可能为错开的A,并列的A,都要考虑清楚,但不存在错开的REPEAT和并列的REPEAT(自己考虑下为什么)。
#include<bits/stdc++.h>
using namespace std;
char map_[1005][40];
int i;
int A;
int row,col;
int dfs(int &row,int col,int repeat){ //当前进行到哪一行 上一行R所在的列号 上一行Repeat执行多少次
int count=0;
while(1){
row++;
if(row>1001)
return count;
i=0;
while(map_[row][i]==' '){
i++;
}
if(i==col && map_[row][i]=='A'){ //下面一行的A与父REPEAT对齐
char *p=strchr(map_[row],'+');
p++;
int t=*(++p)-'0';
count+=t;
return count;
}
if(map_[row][i]=='R' && i!=col){ //一个repeat被父repeat包含
char *p=strchr(map_[row],':');
p--;
count+=dfs(row,i,*(p)-'0')*repeat;
continue;
}
if(map_[row][i]=='A'){ //下面一行A与父REPEAT没对齐
char *p=strchr(map_[row],'+');
p++;
int t=*(++p)-'0';
count+=t*repeat;
continue;
}
row--;
return count;
}
}
int main(){
int count=0;
for(int i=1;i<=1001;i++) //
cin.getline(map_[i],50);
row=2;
col=0;
while(1){
int i=0;
while(map_[row][i]==' '){
i++;
}
if(map_[row][i]=='A'){
char *a=strchr(map_[row],'+');
a++;
count+=*(++a)-'0';
row++;
continue;
}
char *re=strchr(map_[row],':');
int r=*(--re)-'0';
count+=dfs(row,col,r);
row++;
if(row>1001) //
break;
}
printf("A=A+%d",count);
}