题意:给一个三角形,被分成了很多个三角形(具体看题目里的图),求一个最大的只包含白色三角形三角形。
分析:不难但有点小恶心的题目。方法应该很多,怎么数都行了。我是用类似dp的方法的,如果上一层的[j+1,k-1]这个范围能构成一个纯白色三角形,并且这一层的[j,k]这个范围也都是白的,那么f[i][j][k]就代表了一个纯白色的大三角形。代码写得有些啰嗦,懒得简化了。
分析:不难但有点小恶心的题目。方法应该很多,怎么数都行了。我是用类似dp的方法的,如果上一层的[j+1,k-1]这个范围能构成一个纯白色三角形,并且这一层的[j,k]这个范围也都是白的,那么f[i][j][k]就代表了一个纯白色的大三角形。代码写得有些啰嗦,懒得简化了。
#include
<
iostream
>
#include < stdio.h >
#include < memory.h >
#include < cstring >
using namespace std;
int n,ans;
bool f[ 110 ][ 210 ][ 210 ];
char b[ 110 ][ 210 ];
void cal1()
{
int i,j,k,tem,up;
memset(f,false,sizeof(f));
for(j=1;b[1][j];j++)
{
if((j&1)==0&&b[1][j]=='-')
{
f[1][j][j]=true;
ans=1;
}
}
up=1;
for(i=2;i<=n;i++)
{
up+=2;
for(j=1;b[i][j];j++)
{
if(j&1) continue;
for(k=j;b[i][k]=='-'&&k-j+1<=up;k++)
{
if(k&1) continue;
if(k==j)
{
f[i][j][k]=true;
if(1>ans) ans=1;
continue;
}
if(f[i-1][j+2][k]==true)
{
f[i][j][k]=true;
tem=k-j+1;
if((tem+1)*(tem+1)/4>ans) ans=(tem+1)*(tem+1)/4;
}
}
}
}
}
void cal2()
{
int i,j,k,tem,up;
memset(f,false,sizeof(f));
if(b[n][1]=='-')
{
f[n][1][1]=true;
if(1>ans) ans=1;
}
up=1;
for(i=n-1;i>=1;i--)
{
up+=2;
for(j=1;b[i][j];j++)
{
if(!(j&1)) continue;
for(k=j;b[i][k]=='-'&&k-j+1<=up;k++)
{
if(!(k&1)) continue;
if(k==j)
{
f[i][j][k]=true;
if(1>ans) ans=1;
continue;
}
if(f[i+1][j][k-2]==true)
{
f[i][j][k]=true;
tem=k-j+1;
if((tem+1)*(tem+1)/4>ans) ans=(tem+1)*(tem+1)/4;
}
}
}
}
}
int main()
{
int i,j,k,ca=0;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++) scanf("%s",&b[i][1]);
for(i=2;i<=n;i++)
{
for(j=1;b[i][j]==' ';j++);
for(k=1;b[i][j];j++,k++) b[i][k]=b[i][j];
b[i][k]='\0';
} // 转换完毕
ans=0;
cal1();
cal2();
printf("Triangle #%d\n",++ca);
printf("The largest triangle area is %d.\n",ans);
printf("\n");
}
return 0;
}
#include < stdio.h >
#include < memory.h >
#include < cstring >
using namespace std;
int n,ans;
bool f[ 110 ][ 210 ][ 210 ];
char b[ 110 ][ 210 ];
void cal1()
{
int i,j,k,tem,up;
memset(f,false,sizeof(f));
for(j=1;b[1][j];j++)
{
if((j&1)==0&&b[1][j]=='-')
{
f[1][j][j]=true;
ans=1;
}
}
up=1;
for(i=2;i<=n;i++)
{
up+=2;
for(j=1;b[i][j];j++)
{
if(j&1) continue;
for(k=j;b[i][k]=='-'&&k-j+1<=up;k++)
{
if(k&1) continue;
if(k==j)
{
f[i][j][k]=true;
if(1>ans) ans=1;
continue;
}
if(f[i-1][j+2][k]==true)
{
f[i][j][k]=true;
tem=k-j+1;
if((tem+1)*(tem+1)/4>ans) ans=(tem+1)*(tem+1)/4;
}
}
}
}
}
void cal2()
{
int i,j,k,tem,up;
memset(f,false,sizeof(f));
if(b[n][1]=='-')
{
f[n][1][1]=true;
if(1>ans) ans=1;
}
up=1;
for(i=n-1;i>=1;i--)
{
up+=2;
for(j=1;b[i][j];j++)
{
if(!(j&1)) continue;
for(k=j;b[i][k]=='-'&&k-j+1<=up;k++)
{
if(!(k&1)) continue;
if(k==j)
{
f[i][j][k]=true;
if(1>ans) ans=1;
continue;
}
if(f[i+1][j][k-2]==true)
{
f[i][j][k]=true;
tem=k-j+1;
if((tem+1)*(tem+1)/4>ans) ans=(tem+1)*(tem+1)/4;
}
}
}
}
}
int main()
{
int i,j,k,ca=0;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++) scanf("%s",&b[i][1]);
for(i=2;i<=n;i++)
{
for(j=1;b[i][j]==' ';j++);
for(k=1;b[i][j];j++,k++) b[i][k]=b[i][j];
b[i][k]='\0';
} // 转换完毕
ans=0;
cal1();
cal2();
printf("Triangle #%d\n",++ca);
printf("The largest triangle area is %d.\n",ans);
printf("\n");
}
return 0;
}