ACM北大题库——食物链

写了两天才写完!感觉主要是要学会用数组保存信息!写得很乱!

#include<stdio.h>
#include<malloc.h>

void main()
{
//int *a,*b,*c;//存储a,b,c种类动物的编号
int n,k;//n为动物数量,k为语句数量
int c=0;//记录假话次数
int i,j;
int **tab;
int **animal;
int animal_long[4]={0,0,0,0};
//int now=0;//食物链表格当前指向
int x,y;
int flag_1=0,flag_2=0;
scanf("%d %d",&n,&k);
tab=(int **)malloc(k*sizeof(int*));
for(i=0;i<k;i++)
tab[i]=(int *)malloc(3*sizeof(int));
for(i=0;i<k;i++)
{
scanf("%d %d %d",&tab[i][0],&tab[i][1],&tab[i][2]);
}
animal=(int **)malloc(4*sizeof(int *));//开辟int [4][n]大小的二维数组然后初始化0
for(i=0;i<4;i++)      //第一维不用
animal[i]=(int *)malloc(n*sizeof(int));
for(i=0;i<4;i++)
for(j=0;j<n;j++)
animal[i][j]=0;

/***********************以上是初始化部分***********/

for(i=0;i<k;i++)
{
 flag_1=flag_2=0;
 if(tab[i][0]==1)
 {
  if(tab[i][1]>n||tab[i][2]>n) {c++;continue;}//大于N为假话
  else//与以前条件矛盾的条件
   {

   for(y=1;y<4;y++)
    for(x=0;animal[y][x]!=0;x++)
    if(tab[i][1]==animal[y][x])
    { flag_1=y;goto a1;}
a1:    for(y=1;y<4;y++)
    for(x=0;animal[y][x]!=0;x++)
    if(tab[i][2]==animal[y][x])
    { flag_2=y;goto a2;}
   
a2:    if(flag_1==0&&flag_2==0&&(tab[i][1]==tab[i][2]))//当为新编号时,并且相等时
   {
    animal[1][animal_long[1]++]=tab[i][1];//新条件,新分类,统一放入第一类
  continue;//不是假话
   }
   else if(flag_1==0&&flag_2!=0)//当1为新,2为旧时,把1放入2的同一类
   {
   animal[flag_2][animal_long[flag_2]++]=tab[i][1];
   continue;//不是假话
   }
   else if(flag_2==0&&flag_1!=0)//当2为新,1为旧时,把2归入1的同一类
   {
   animal[flag_1][animal_long[flag_1]++]=tab[i][2];
  continue;//不是假话
   }
   else if(flag_1!=flag_2)//如果1和2不为同一类则为假话
   {
    c++;continue;//假话
   }
  }//else
 }//if
 else if(tab[i][0]==2)
 {
  if(tab[i][1]==tab[i][2]){ c++;continue;}//x吃x是假话
  else if(tab[i][1]>n&&tab[i][2]>n) {c++;continue;}//大于N为假话
  else
  {
  for(y=1;y<4;y++)
  for(x=0;animal[y][x]!=0;x++)
   if(tab[i][1]==animal[y][x]) {flag_1=y;goto a3;}
a3: for(y=1;y<4;y++)
  for(x=0;animal[y][x]!=0;x++)
   if(tab[i][2]==animal[y][x]) {flag_2=y;goto a4;}
a4:   if(flag_1==0&&flag_2==0)//都为新编号,则统一把1放入1类,2放入2类
   {
   animal[1][animal_long[1]++]=tab[i][1];
   animal[2][animal_long[2]++]=tab[i][2];
   continue;
   }
   else if(flag_1==0&&flag_2!=0)//1为新,2为旧
   {
   if(flag_2==1) animal[3][animal_long[3]++]=tab[i][1];
   else animal[flag_2-1][animal_long[flag_2-1]++]=tab[i][1];
   continue;
   }
   else if(flag_2==0&&flag_1!=0)//1为旧,2为新
   {
   if(flag_1==3) animal[1][animal_long[1]++]=tab[i][2];//1为第三类时,2应该放入第一类
   else animal[flag_1+1][animal_long[(flag_1+1)]++]=tab[i][2];
    continue;
   }
   else if(flag_1!=0&&flag_2!=0)//1,2都为旧的
   {
    if(flag_1==3) //当1为第三类时,查找第一类
    {
    for(y=0;animal[1][y]!=tab[i][2];y++)
    if(animal[1][y]==0)//循环结束没有找到为假话
    {c++;break;}//假话
    else continue;//for
    }//if
    else
    {
    for(y=0;animal[1][y]!=tab[i][2];y++)
    if(animal[flag_1+1][y]==0)//循环结束没有找到为假话
     {c++;break;}
    else continue;
    }//else
   }
 }// else if
 }//else
}//for

printf("%d",c);

}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值