这道题目并不难,只是用了一下递归,不过对于字符串处理,中间有很多的小细节都需要注意。。
思路很简单,对于每一个白色的三角形先判断开口向上还是向下,然后选择不同的递归。。
只需记录起点和终点,然后访问之间的点,
代码:
# 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;
}
浙公网安备 33010602011771号