zoj1245Triangles

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

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

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

代码:

# 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;

}

你可能感兴趣的:(RIA)