C语言代码递归实现:洛谷P1928—外星密码

我看到网上的题解部分都是C++,有C语言的题解也没法全AC,这道题自己写起来还是比较复杂的。

思路:

这是一道经典的递归题目,大致方法为没遇到一个左括号 ‘ [ ’ 就递归一次。整体难度还是不大的,就是要处理好一些细节方面的问题,并计算字符串的标记处。

(没听懂的可以去看看c++题解的文章,写的非常详细,这里仅是使用C语言写出的题解)

不啰嗦,直接上代码吧。

#include <stdio.h>
#include <string.h>

char arr[20001];//存放初始数组 
char end[20001];//存放答案 
int begin=0;//定义end的长度,用于存入操作 

void ikun(char arr[])
{
	int len=strlen(arr);
	
	int i,j;
	for(i=0;i<len;i++)
	{
		if(arr[i]!='[')//判断递归的条件 
		{
			end[begin]=arr[i];//正常情况直接粘贴到数组end中去 
			begin++;
		}
		else 
		{
			i++;//不正常情况把arr位置后移一格 
			int t=arr[i]-48;
			
			if(arr[i+1]<='9'&&arr[i+1]>='0')
			{
				t=t*10+arr[i+1]-48;//记录反复输出的次数到参数t 
				i++;
			}
			
			int mark_kuohao=1;//标记括号数目(奇数为不合格,偶数可以输出) 
			int mark_num=0;
			char num[20001];
			
			memset(num,0,sizeof num);//初始化num字符串 
			
			for(j=i+1;j<len;j++)
			{
				if(arr[j]=='[')mark_kuohao++;
				if(arr[j]==']')mark_kuohao--;// 计算括号是否配对 
				
				if(mark_kuohao==0)break;//直到到达其对应的右括号中退出
				
				num[mark_num]=arr[j];//复制括号内的所有字符串到num
				mark_num++;
			}
			
			int len_num=strlen(num);//计算num的长度用于计算递归后返回的位置 
			int k;
			
			for(k=0;k<t;k++)	
			{
				ikun(num);//递归:对应t次数的for循环 
			}
			//递归重括号内的字符串新处理 
			
			i+=len_num+1;
			//标记返还递归后的位置 
			
			memset(num,0,sizeof num);
			//初始化num数组	
		}
	}
	return;
}

int main()
{
    int i,j;
	scanf("%s",&arr);	
	ikun(arr);//主函数没什么好说的 
	printf("%s",end);
	return 0;
}

写了三天了,终于过了,太不容易了!

-____-"

唉~別提写代码的过程了.....(难绷啊)

思路仅供参考,不是最优解法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值