蓝桥杯 REPEAT程序(DFS)

问题描述
附件 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);
	
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值