C语言解决是谁打碎花瓶的问题

逛贴吧偶遇一道很新颖的C语言编程题,想到自己的C语言荒废了很久,便决定花点时间解决一下练练手。
具体题目如下:
实验题目(4)【见实验教材实验五的题目6】:编写程序exp5_6.c,请判断花瓶是谁打碎的。教师花瓶碎了,班级只有四个小同学,老师询问小同学,已知是其中1人打碎的,还知道4人中每个人要么是诚实的,要么总是说谎的。
小同学回答老师的问题是:
甲说:“乙没有打碎,是丁打碎的。”
乙说:“我没有打碎,是丙打碎的。”
丙说:“甲没有打碎,是乙打碎的。”
丁说:“我没有打碎。”
根据四人回答判断谁打碎了花瓶。
**什么?书??我没有书啊?**硬着头皮写吧

#include<stdio.h>
int a[4]={0,0,0,0};//数组a用来表示甲乙丙丁四个人的标志,若为1则表示是他打碎了花瓶
int b[4]={0,0,0,0};//数组b用来表示甲乙丙丁四个人陈述的命题的真否,1表示否命题
int check(int t[4])
{
    //判断甲所陈述的命题
	int flag=1;    //FLAG标志判断是否运行以下程序
	if(t[0]==1)   //甲说谎
	{
		if(t[1]==1&&t[3]==0)  //若甲说谎则乙说的是真话且丁说谎;以下同理
		{
			a[1]=1;
		
			a[3]=0;
			flag=0;
		}
		
	}
	else{
		if(t[2]==1&&t[3]==1)
		{
			a[1]=0;
		
			a[3]=1;
			flag=0;
		}
	
	}
	if(flag){
	return 0;  //若该情况不可能满足,则返回主程序
	}




   flag=1;//判断乙说的话
    if(t[1]==1){
		if(t[0]==1&&t[2]==0){
			a[1]=1;
			a[2]=0;
		flag=0;
		}
	
	}
	else{
		if(t[0]==0&&t[2]==1){
    a[1]=0;
	a[2]=1;
		flag=0;
		}
	
	}
	if(flag){
	return 0;
	}





   flag=1;//判断丙说的话
	if(t[2]==1){
		if(t[1]==0&&t[0]==0){

	a[0]=1;
	a[1]=0;
		flag=0;}
	
		}
		else{
			if(t[0]==1&&t[1]==1){
	           a[0]=0;
	          a[1]=1;
			  flag=0;

	}

}
if(flag){
	return 0;
	}





flag=1;//判断丁说的话
	if(t[3]==1){
		if(t[0]==0){

			a[3]=1;
		flag=0;
		}
		}
	else{
		if(t[0]==1){
			a[3]=0;
		flag=0;}
	
}
	if(flag){
	return 0;
	}
	return 1;//判断程序正确执行,返回标志1

}
int main()
{
	
	for(int i=0;i<16;i++)
	{ 
		int m=3;
		int n=i;
		while(n)
		{
			b[m]=n%2;
			n=n/2;
			m--;
		}
		for(int k=0;k<4;k++)
		{
		   printf("%d",b[k]);
		}               //将16种可能情况一一遍历
		printf("\n");
		int c=check(b);			
		if(c&&(a[0]+a[1]+a[2]+a[3])==1)//判断完毕且得到一个人打碎了花瓶
			{
			printf("it is ");
				for(int t=0;t<4;t++)
				{
					
						printf("%d",a[t]);//输出标志数组
					
				}

              printf("\n");
			}
	}
		
		
	
	
       return 0;
}

程序运行后结果如下
C语言解决是谁打碎花瓶的问题
由此可以判断是乙打碎了花瓶
C语言新手,如有错误欢迎指正
程序还可进行优化,学业繁重,告辞。