您的位置:首页 > 其它

ACM北大题库——食物链

2010-08-08 11:12 330 查看
写了两天才写完!感觉主要是要学会用数组保存信息!写得很乱!

#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]
大小的二维数组然后初始化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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: