P9456 题解
题目传送门
Easy Version 传送门
感觉这题评黄有些过分,应该是中位橙的难度,但真的很烧脑干
分析
本题难点在于特别特别为复杂的坐标转换。
首先是读入,大致有两种读入方法。第一种是按题面的输入,题面写的是输入的
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++)
{
for(int l=1;l<=m;l++)
{
cin>>a[j][l][i];
}
}
}
然后我们再沿三种视图来讲解:
正视图
正视图要求自上而下自左至右。因此我们首先需要倒序枚举
正视图部分代码:
for(int i=k;i;i--)
{
for(int j=1;j<=n;j++)
{
int flag=0;
for(int l=1;l<=m;l++)
{
if(a[j][l][i])
{
flag=1;
break;
}
}
cout<<flag<<" ";
}
putchar('\n');
}
左视图
左视图要求自上而下自后至前。因此我们首先需要倒序枚举
但是这里还需注意,这里不应该再是
这个规律通用于三个俯视图。当然,你也可以称其为小技巧。
左视图部分代码:
for(int i=k;i;i--)
{
for(int j=m;j;j--)
{
int flag=0;
for(int l=1;l<=n;l++)
{
if(a[l][j][i])
{
flag=1;
break;
}
}
cout<<flag<<" ";
}
putchar('\n');
}
俯视图
俯视图要求自后至前自左至右。因此我们首先需要倒序枚举
这里循环变量也需对应,按“左视图”里的方法对应后,此处应为
俯视图部分代码:
for(int i=m;i;i--)
{
for(int j=1;j<=n;j++)
{
int flag=0;
for(int l=1;l<=k;l++)
{
if(a[j][i][l])
{
flag=1;
break;
}
}
cout<<flag<<" ";
}
putchar('\n');
}
完整代码就不给了,组合一下四段代码就是。
最后再说一个小技巧吧。下次遇到这种题目,各位如果实在不知道或想不出来要不要倒序或怎么将循环变量对应,就可以尝试枚举所有种情况。枚举这 但至少可以 AC,赛时我就是这样 AC 的。