在一次外交活动中,四位友人进行那有趣的交谈,又汉英法德四种语言具体情况如下甲乙丙将两种语言有一种

言在四人中有三人都会。甲会德语,丁不会德语,乙不会英语。甲与丙,丙与丁不能直接交淡,乙与丙可以直接交谈,没有人既会德语,又会法语。甲,乙,丙丁各会什么语言。列方格表示... 言在四人中有三人都会。甲会德语,丁不会德语,乙不会英语。甲与丙,丙与丁不能直接交淡,乙与丙可以直接交谈,没有人既会德语,又会法语。甲,乙,丙丁各会什么语言。列方格表示 展开
 我来答
mr_shj
2018-05-26 · TA获得超过2682个赞
知道大有可为答主
回答量:1665
采纳率:94%
帮助的人:1387万
展开全部

#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);

}

}

wzc2027
高粉答主

推荐于2018-05-26 · 繁杂信息太多,你要学会辨别
知道大有可为答主
回答量:3万
采纳率:69%
帮助的人:5153万
展开全部
汉 英 法 德
甲 √ √ × √
乙 √ × √ ×
丙 × × √ ×
丁 √ × × ×
追答
汉  英  法  德
甲 √ × × √
乙 √ × √ ×
丙 × √ √ ×
丁 √ × × ×
下一个是对的
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9872e1b
2018-05-22
知道答主
回答量:19
采纳率:0%
帮助的人:1.6万
展开全部
应为甲会德语,所以不会法语。甲与丙不能直接交谈,所以丙不会德语,乙不会英语,却可以和丙直接交谈,所以可能会汉语、法语或法语、德语而丙又不会德语,所以可以认定丙和乙都会法语。而丁不能和丙直接交谈,所以丁不会法语。有三个人会同一种语言,从以上来看只可能是汉语,而从甲和丁都不能和丙直接交谈看,丙不会汉语。所以甲会德、汉语。丁必须会汉语。乙会法语,但从没人既会德语,又会法语来看,乙会法、汉语(也要从乙不会英语看)丙不可能会汉语,应为有3人会汉语。丙也不会德语(应为如果会德语,丙就可以和甲直接交谈)丙只能会英语和法语了。不用谢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式