这道题目并不难,只是用了一下递归,不过对于字符串处理,中间有很多的小细节都需要注意。。

思路很简单,对于每一个白色的三角形先判断开口向上还是向下,然后选择不同的递归。。

只需记录起点和终点,然后访问之间的点,

代码:

# include<stdio.h>
# include<string.h>
char map[105][205];
int count,n;
void dfs1(int r,int from ,int to)
{
	int i,ans;
	if(r>=n) return;
	ans=n-1-r;/*ans表示该行前面有多少空格*/
	if(!(from>=ans &&to<2*r+1+ans)) return;
	for(i=from;i<=to;i++)
	{
		if(map[r][i]!='-') return;
	}
	dfs1(r+1,from-1,to+1);
	count+=to-from+1;
}
void dfs2(int r,int from,int to)
{
	int i,ans;
	if(r<0) return;
	ans=n-1-r;/*ans表示该行前面有多少空格*/
	if(!(from>=ans && to<2*r+1+ans)) return;
	for(i=from;i<=to;i++)
		if(map[r][i]!='-') return;
		dfs2(r-1,from-1,to+1);
		count+=to-from+1;
}
int main()
{
	int i,j,max,ans,t=0;
	while(scanf("%d",&n)!=EOF && n)
	{
		t++;
		getchar();
		for(i=n-1;i>=0;i--)
			gets(map[i]);
		max=0;
		for(i=n-1;i>=0;i--)
		{
			ans=n-1-i;/*ans表示该行前面有多少空格*/
			for(j=ans;j<2*i+1+ans;j++)
			{
				if(map[i][j]=='-')
				{
					count=0;
					if((j-ans)%2==0) dfs1(i,j,j);/*判断三角形是开口向上还是向下*/
					else dfs2(i,j,j);
					if(count>max) max=count;
				}
			}
		}
			printf("Triangle #%d\nThe largest triangle area is %d.\n\n",t,max);
	}
	return 0;
}
posted on 2011-04-06 13:37  奋斗青春  阅读(247)  评论(0编辑  收藏  举报