菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题意:

Homer教授被报道失踪了,我们怀疑这和他最近的研究有关,但是我们确实不知道他最近在研究什么.

侦探们试图侵入他的电脑,再几次失败后才意思到教授的智力超出他们很多..........................................................

输入:

第一行输入一个数字表示树的数目(1<T<20),每个树的输入结尾以#结尾,从上到下的风格画树,

每个结点的标记字符是任意一个可的打印的字符,除了‘-’,‘|’,‘ ’空格,如果一个下面有一个'|'表示它有一个儿子,下一行是一行'-',至少覆盖子树的边缘,

输出:

先序遍历

#include <stdio.h>
#include<math.h>
#include <memory.h>
#include<queue>
#include <iostream>
using namespace std;
string dfs(int i, int j, int total);

const int N = 220;
char map[N][N];

int findKey(int i, int j)
{
	int kk = -1;
	for (int k = j;; k++)
	{
		if (i != 0 && map[i - 1][k] == ' ')
			return -1;
		if (map[i][k] == '\0')
		{
			return -1;
		}
		if (map[i][k] == ' ')
			continue;
		kk = k;
		break;
	}
	return kk;
}
string dfsSub(int i, int j, int total)
{
	//有子树
	while (j != 0 && map[i + 1][j - 1] == '-')
		j--;
	//找到key的开始
	while (map[i + 2][j] == ' ')
		j++;
	return dfs(i + 2, j, total);
}
string dfs(int i, int j, int total)
{
	string str = "";
	if (i == total)
		return str;
	int next = -1;
	if ((next = findKey(i, j)) == -1)
	{
		return str;
	}
	j = next;
	str += map[i][next];

	str = str + "(";
	if (i + 1 != total && map[i + 1][j] == '|')
	{
		string s2 = dfsSub(i + 1, j, total);
		str += s2;
	}
	str = str + ")";
	//下一个key,注意上层的---
	str += dfs(i, j + 1, total);
	return str;
}

int main()
{
	//freopen("d:\\1.txt", "r", stdin);

	int n;
	cin >> n;
	getchar();
	while (n--)
	{
		memset(map, 0, sizeof(map));
		int total = 0;
		while (true)
		{
			gets(map[total]);
			if (map[total][0] == '#')
			{
				break;
			}
			total++;
		}
		string str = "(";
		str += dfs(0, 0, total);
		str += ")";
		cout << str << endl;
	}
	return 0;
}

  感觉还是不能看别人题解!!!!!!!

posted on 2017-08-05 15:26  好吧,就是菜菜  阅读(160)  评论(0编辑  收藏  举报