用c语言求的甲乙丙丁的名次,并输出。
想了一个晚上,有思路,想用二维数组做,写了一半头大,想问问各位有什么更好的思路吗
#include "stdio.h"
void main()
{
int a,b,c,d;
/*a,b,c,d表示名次(1,2,3,4)*/
/*丁队是第一名表示为(b==1)*/
/*甲队不是第一名,并且乙队不是第二名表示为((a!=1)&&(b!=2))*/
/*如果乙队是第二名,那么丙队不是第三名表示为((b==2)&&(c!=3))||((b!=2)&&(c==3))*/
/*如果甲队不是第一名,那么乙队是第二名表示为((a!=1)&&(b==2))||((a==1)&&(b!=2))*/
for(a=1;a<=4;a++)
for(b=1;b<=4;b++)
for(c=1;c<=4;c++)
for(d=1;d<=4;d++)
{
/**************穷举每个人说真话或说假话的各种可能情况*********************/
/*第一个人对*/
if((b==1)&&(a+b+c+d==10))
{
/*其他的人错*/
if(!(((a!=1)&&(b!=2))
&&(((b==2)&&(c!=3))||((b!=2)&&(c==3)))
&&(((a!=1)&&(b==2))||((a==1)&&(b!=2)))))
if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d)
{
printf("第一个同学是对的,其他的都是错的!!\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
}
}
/*第二个人对*/
if(((a!=1)&&(b!=2))&&(a+b+c+d==10))
{
/*其他的人错*/
if(!((b==1)
&&(((b==2)&&(c!=3))||((b!=2)&&(c==3)))
&&(((a!=1)&&(b==2))||((a==1)&&(b!=2)))))
if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d)
{
printf("第二个同学是对的,其他的都是错的!!\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
}
}
/*第三个人对*/
if((((b==2)&&(c!=3))||((b!=2)&&(c==3)))&&(a+b+c+d==10))
{
/*其他的人错*/
if(!((b==1)
&&(((a!=1)&&(b!=2)))
&&(((a!=1)&&(b==2))||((a==1)&&(b!=2)))))
if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d)
{
printf("第三个同学是对的,其他的都是错的!!\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
}
}
/*第四个人对*/
if((((a!=1)&&(b==2))||((a==1)&&(b!=2)))&&(a+b+c+d==10))
{
/*其他的人错*/
if(!((b==1)
&&((a!=1)&&(b!=2))
&&(((b==2)&&(c!=3))||((b!=2)&&(c==3)))))
if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d)
{
printf("第四个同学是对的,其他的都是错的!!\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
}
}
}
}