uva10562

思路:关键是输入怎么存储,这里使用一个buf[][]二维数组存储的,这样做的好处是,可以跨行查询,也就是说

我们要判断一个字母是否拥有子树,那就要查询它正下方是否是一个‘|’字符,这里就需要跨行查询

然后再跨行找到”---------------------“,再跨行找到”----------------“下面的字母,对每个字母调用递归函数即可

package test;

import java.util.Scanner;


public class Test{	
	static Scanner sc = new Scanner(System.in);
	static String line;
	
	static int n = 20;
	static char[][] buf = new char[n][n];//存储输入的树
	
	/**
	 * 字母的横纵坐标
	 * @param r
	 * @param c
	 */
	static void build(int r, int c){
		System.out.print(buf[r][c]+"(");
		if(r+1 <n && buf[r+1][c]=='|'){//没有越界,并且有子树
			int i = c;
			while(i>0 && buf[r+2][i-1]=='-') i--;//找到"---"左边界
			while(buf[r+2][i]=='-' && buf[r+3][i]!='\0'){//找到字母
				if(' '!=buf[r+3][i]){
					build(r+3,i);//递归建树
				}
				i++;
			}
		}
		System.out.print(")");
	}
	
	public static void main(String[] args) {
		//输入
		int i = 0;
		while(!"#".equals((line=sc.nextLine()))){
			int j = 0;
			for(char c:line.toCharArray()){
				buf[i][j] = c;
				j++;
			}
			i++;
		}
		
		
		System.out.print("(");
		for(i=0;i<buf[0].length;i++){
			if(buf[0][i]!=' '){
				build(0,i);
				break;
			}
		}
		System.out.print(")");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值