题目207:食物链

来源:互联网 发布:沥青薄膜加热试验数据 编辑:程序博客网 时间:2024/06/16 03:46


描述

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。AB BCCA 
现有N个动物,以1N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 
有人用两种说法对这N个动物所构成的食物链关系进行描述: 
第一种说法是"1X Y",表示XY是同类。 
第二种说法是"2X Y",表示XY 
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 
1
当前的话与前面的某些真的话冲突,就是假话; 
2
当前的话中XYN大,就是假话; 
3
当前的话表示XX,就是假话。 
你的任务是根据给定的N1 <=N <= 50,000)和K句话(0 <=K <= 100,000),输出假话的总数。 

输入

第一行是两个整数NK,以一个空格分隔。 
以下K行每行是三个正整数 DXY,两数之间用一个空格隔开,其中D表示说法的种类。 
D=1,则表示XY是同类。 
D=2,则表示XY

输出

只有一个整数,表示假话的数目。

样例输入

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

样例输出

3

 

#include<iostream>

using namespace std;

bool TRUE=1,FALSE=0;

int N;

int A_list[20][3];  //参照表

int last=0;

bool Judge(int D,int X,int Y);

 

int main()

{

   cout<<"请输入数据:";

   int K;

   cin>>N>>K; //动物个数 句子个数

   int lie_num=0;

   while(K--)

    {

       int D,X,Y;

       cin>>D>>X>>Y;

       if(Judge(D,X,Y)==FALSE)

           ++lie_num;  //若是假话

    }

   cout<<"\nThe number of lie is:"<<lie_num<<endl;

   return 0;

}

bool Judge(int D,int X,int Y)

{

   if(X>N||Y>N)    //超出范围

       return FALSE;

   if(D==2&&X==Y)  //同类不能互相吃

       return FALSE;

   for(int i=0;i<last;i++)

    {

       if(A_list[i][0]==X&&A_list[i][1]==Y

          ||A_list[i][0]==Y&&A_list[i][1]==X)

          {

              if(A_list[i][2]!=D)

                    return FALSE;

          }

    }

   if(X!=Y)

    {

       A_list[last][0]=X;

       A_list[last][1]=Y;

       A_list[last][2]=D;

       ++last;

    }//新建对照组

   return TRUE;

}

 

 

这道题目看似很复杂,但是只要提取其中的限制条件就可以很容易解答出来。而限制条件就是题目明确给出的对于假话的3条定义。

      首先要注意的是,这里的食物链是不同于现实中的食物链,它是一个环形的,例如:1能吃2,2能吃3,那么这里隐含的就是:3能吃1,而不是1能吃3。

      为了判断当前句子是否和之前的真话有冲突,我们需要对有捕食关系的动物进行记录,并且在记录的过程中就把隐含的关系一并推出来和记录进去。

0 0