全班同学排成 6 排。A、B、C、D、E、F 等 6 人分别站在第 1 排到第 6 排。已知 A 不在第一排,A 与 B 前后相邻,C 在 D 前面,E 在 B 的前两排,C 在 F后的第 4 排。问A、B、C、D、E、F各在第几排。同样我们先将条件的自然语言描述转变为条件的逻辑语言描述如下:
C 在 D 前面 : c < d
A不在第一排 : a != 1
E 在 B 的前两排 : e = b - 2
A 与 B 前后相邻 : ( a = b - 1 ) || (a = b + 1)
C 在 F后的第 4 排 : c = f + 4
均满足( 1 <= a,b,c,d,e,f <=6 ) ,且( a != b && a != c && a != d && a != e && a != f )&& ( b != c && b != d && b != e && b != f) && ( c != d && c != e && c !=f) && (d != e && d != f ) && ( e != f ) 则用C语言实现如下:
#include "stdio.h" #include "stdlib.h" #define Max 6 // 指出最大的排号 #define Min 1 // 指出最小的排号 int main(int argc,char *argv[]) { // a b c d e f 分别代表着 A B C D E F int a = 0 , b = 0, c = 0, d = 0, e = 0 ,f = 0; // 穷举 a b c d e f 的可能性,每一个都有 6 种可能,则进行 6 的 6 次放穷举 for( a = Min ; a <= Max ; a ++) { for( b = Min ; b <= Max ; b ++) { for(c = Min ; c <= Max ; c ++) { for(d = Min ; d <= Max ; d ++) { for(e = Min ; e <= Max ; e ++) { for(f = Min ; f <= Max ; f++) { if( a != 1 ) // A不在第一排 { if( c < d ) // C 在 D 前面 { if( e == ( b - 2 ) ) // E 在 B 的前两排 { if( ( a == ( b - 1 ) ) || ( a == (b + 1) ) ) // A 与 B 前后相邻 { if( c == ( f + 4 ) ) // C 在 F后的第 4 排 { if( a != b && a != c && a != d && a != e && a != f ) { if( b != c && b != d && b != e && b != f ) { if( c != d && c != e && c !=f ) { if( d != e && d != f && e != f ) { printf("最后的获奖情况如下:\n"); printf("a = %d\nb = %d\n",a,b); printf("c = %d\nd = %d\n",c,d); printf("e = %d\nf = %d\n",e,f); } } } } } } } } } } } } } } } system("pause"); return 0 ; } |