突破口:开一个三维数组,模拟三维直角坐标系,详见代码。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e2+5;
int s[maxn][maxn][maxn];
int main()
{
int x,y,z,i,j,k;
int sum;
while(~scanf("%d%d%d",&x,&y,&z))
{
sum=0;
for(i=0;i<=x;i++)
for(j=0;j<=y;j++)
for(k=0;k<=z;k++)
s[i][j][k]=0;
for(i=1;i<=x;i++)
for(j=1;j<=y;j++)
{
scanf("%d",&s[i][j][0]);
if(s[i][j][0]==1) //等于1说明在这个位置有小正方形的投影,就将s[i,j,1~z]全部+1(相当于过该点画一条直线垂直于xOy)
for(k=1;k<=z;k++)
s[i][j][k]++;
}
for(i=1;i<=y;i++)
for(j=1;j<=z;j++)
{
scanf("%d",&s[0][i][j]);
if(s[0][i][j]==1) //等于1说明在这个位置有小正方形的投影,就将s[1~i,j,z]全部+1(相当于过该点画一条直线垂直于yOz)
for(k=1;k<=x;k++)
s[k][i][j]++;
}
for(i=1;i<=z;i++)
for(j=1;j<=x;j++)
{
scanf("%d",&s[j][0][i]); //等于1说明在这个位置有小正方形的投影,就将s[ij,1~y,z]全部+1相当于过该点画一条直线垂直于xOz)
if(s[j][0][i]==1)
for(k=1;k<=y;k++)
s[j][k][i]++;
}
for(i=0;i<=x;i++)
for(j=0;j<=y;j++)
for(k=0;k<=z;k++)
if(s[i][j][k]==3) //只有当这个位置的值为3时,才有小正方形(即为三条直线相交之处)
sum++;
printf("%d\n",sum);
}
return 0;
}
Tips:这道题要特别注意输入,输入一乱,全盘皆输。