在一次外交活动中,四位友人进行那有趣的交谈,又汉英法德四种语言具体情况如下甲乙丙将两种语言有一种
#define N 4
#include <stdio.h>
void jianmo(int a[N][N],int n){ //建模
int i,j;
for(i=0;i<N;i++) for(j=0;j<N;j++){
a[i][j]=n%2;
n=n/2;
}
}
void printit(int a[N][N]){ //输出数组
int i,j;
char r[4][4]={"甲","乙","丙","丁"};
printf(" 汉英法德\n");
for(i=0;i<N;i++){
printf("%s",r[i]);
for(j=0;j<N;j++)
printf("%2d",a[i][j]);
printf("\n");
}
}
int kejiaoliu(int a[N][N],int x,int y){ //判定x和y能否交流
for(int i=0;i<N;i++)
if(a[x][i]==1 && a[y][i]==1) return 1;
return 0;
}
int issame(int a[],int n,int x){ //递归栈中的数据是否一样
for(int i=0;i<=n;i++)
if (a[i]==x) return 1;
return 0;
}
int dojl(int a[N][N],int jl[N],int n,int m){ //递归检查可相互交流的人员
int i;
if (m>=N) return 1;
if (m>n) return 0;
for(i=0;i<N;i++){
if (issame(jl,n,i)==1) continue;
if (kejiaoliu(a,jl[m],i)==1) jl[++n]=i;
}
return dojl(a,jl,n,m+1);
}
int jiaoliu(int a[N][N]){ //是否4人可以相互交流
int jl[N]={0,0,0,0};
return dojl(a,jl,0,0);
}
int huiyy(int a[N][N],int n){ //会某种语言的有多少人
int count=0;
for(int i=0;i<N;i++)
count+=a[i][n];
return count;
}
int main(){
int i;//用i的二进制来建模
int a[4][4];
for(i=0;i<=0xFFFF;i++){
jianmo(a,i); //数组建模
if(a[1][1]!=0) continue; //乙不会英语
if(a[3][3]!=0) continue; //丁不会德语
if(a[0][3]!=1) continue; //甲会德语
if(a[0][0]+a[2][0]==2 || a[0][1]+a[2][1]==2 || a[0][2]+a[2][2]==2 || a[0][3]+a[2][3]==2)
continue; //甲与丙不能直接交流
if(a[2][0]+a[3][0]==2 || a[2][1]+a[3][1]==2 || a[2][2]+a[3][2]==2 || a[2][3]+a[3][3]==2)
continue; //丙与丁不能直接交淡
if(!(a[1][0]+a[2][0]==2 || a[1][1]+a[2][1]==2 || a[1][2]+a[2][2]==2 || a[1][3]+a[2][3]==2))
continue; //乙与丙可以直接交谈
if(a[0][2]+a[0][3]==2 || a[1][2]+a[1][3]==2 || a[2][2]+a[2][3]==2 || a[3][2]+a[3][3]==2)
continue; //没有人既会德语,又会法语
if(a[0][0]+a[0][1]+a[0][2]+a[0][3]!=2) continue; //甲会2种语言
if(a[1][0]+a[1][1]+a[1][2]+a[1][3]!=2) continue; //乙会2种语言
if(a[2][0]+a[2][1]+a[2][2]+a[2][3]!=2) continue; //丙会2种语言
if(!(huiyy(a,0)==3 || huiyy(a,1)==3 || huiyy(a,2)==3 || huiyy(a,3)==3))
continue; //有一种语言3人会;
if(jiaoliu(a)==0) continue; //检查能不能相互交流 题目中可以没有这个要求,花了很多精力来完成这个
printit(a);
}
}
甲 √ √ × √
乙 √ × √ ×
丙 × × √ ×
丁 √ × × ×
汉 英 法 德
甲 √ × × √
乙 √ × √ ×
丙 × √ √ ×
丁 √ × × ×
下一个是对的