zoj1245Triangles

1384 단어 RIA
이 문제는 어렵지 않다. 단지 귀속을 한 번 썼을 뿐이지만, 문자열 처리에 있어서는 중간에 많은 작은 세부 사항을 주의해야 한다.
사고방식은 매우 간단하다. 모든 흰색의 삼각형에 대해 먼저 입구가 위로 향하는지 아래로 향하는지 판단한 다음에 서로 다른 귀속을 선택한다.
시작점과 끝점을 기록하고 사이의 점을 방문하면
코드:
# 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
The largest triangle area is %d.

",t,max); } return 0; }

좋은 웹페이지 즐겨찾기