vijos P1697 平面几何

vijos P1697 平面几何

定义一个二维数组d[i][j],d[i][j]==0表示i和j的关系不明确,d[i][j]==1表示i和j平行,d[i][j]==2表示i和j垂直。这样的话就可以像Floyed一样递推,具体递推方式请看代码,写得很清楚。

以下是我的代码:

#include < stdio.h >
#define  MAXN 208
int  main()
{
    
long n,m,p,d[MAXN][MAXN]={0};
    
long i,j,k,a,b,tmp,ans;
    
char ch,wrong[]="There must be something wrong";
    
char s1[]="Parallel.",s2[]="Vertical.",s3[]="No idea.";
    scanf(
"%ld%ld%ld\n",&n,&m,&p);
    
for(i=1;i<=m;i++)
    
{
       getchar();
       scanf(
"%ld",&a);getchar();
       ch
=getchar();getchar();getchar();
       scanf(
"%ld\n",&b);
       
if(ch=='p')
       
{
          
if(d[a][b]==2||d[b][a]==2)
          
{
             printf(
"%s\n",wrong);
             
return;
          }

          d[a][b]
=d[b][a]=1;
       }

       
else if(ch=='v')
       
{
          
if(d[a][b]==1||d[b][a]==1)
          
{
             printf(
"%s\n",wrong);
             
return;
          }

          d[a][b]
=d[b][a]=2;
       }

    }

    
// Read In
    for(k=1;k<=n;k++)
      
for(i=1;i<=n;i++)
        
for(j=1;j<=n;j++)
          
if(k!=i&&i!=j&&j!=k)
          
{
             tmp
=d[i][j];
             
if(d[i][k]==1&&d[k][j]==1)
               d[i][j]
=d[j][i]=1;
             
else if(d[i][k]==2&&d[k][j]==2)
               d[i][j]
=d[j][i]=1;
             
else if((d[i][k]==1&&d[k][j]==2)||(d[i][k]==2&&d[k][j]==1))
               d[i][j]
=d[j][i]=2;
             
if((tmp==1&&d[i][j]==2)||(tmp==2&&d[i][j]==1))
             
{
                printf(
"%s\n",wrong);
                
return;
             }

          }

    ans
=0;
    
for(i=1;i<=n;i++)
      
for(j=1;j<=n;j++)
        
if(d[i][j]==1)
          ans
++;
    printf(
"%ld\n",ans/2);
    
for(i=1;i<=p;i++)
    
{
       getchar();scanf(
"%ld",&a);
       getchar();getchar();
       scanf(
"%ld\n",&b);
       
if(d[a][b]==1)
         printf(
"%s\n",s1);
       
else if(d[a][b]==2)
         printf(
"%s\n",s2);
       
else if(d[a][b]==0)
         printf(
"%s\n",s3);
    }

return 0;
}

你可能感兴趣的:(vijos P1697 平面几何)