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