- 論壇徽章:
- 0
|
原帖由 rubee 于 2007-8-14 22:10 發(fā)表 ![]()
第二題:某地刑偵大隊(duì)對涉及六個嫌疑人的一樁疑案進(jìn)行分析:
A、B 至少有一人作案;
A、E、F 三人中至少有兩人參與作案;
A、D 不可能是同案犯;
B、C 或同時作案,或與本案無關(guān);
C、D 中有且僅有一人作案;
如果 D 沒有參與作案,則 E 也不可能參與作案。
試編一程序,將作案人找出來
比較笨,用的是窮舉!
跟上題一樣,排列出所有可能的罪犯組合類型,
我們用一個int來表達(dá),最低位為A,依次升高為B、C、D、E、F
(既A是第0位、B第1位、C2、D3、E4、F5)
如果A、B、D是罪犯的話,那表達(dá)出來就是
(1<<0)+(1<<1)+(1<<3) = 1+2+8 = 13
現(xiàn)在列舉所有的罪犯組合,只需要循環(huán),從0到(2^6-1)
思想是這個樣子的,把所有一切都轉(zhuǎn)化成數(shù)目的思考!
比如X、Y同犯,則表明數(shù)目是2
要判斷罪犯列表中X、Y是否是同犯,
只要把X、Y的組合與整體的罪犯組合與運(yùn)算后,
2進(jìn)制中依然能數(shù)出來2個1,則確定X、Y是同犯成立
statu2int函數(shù)就是屬狀態(tài)碼的2進(jìn)制中數(shù)有多少個罪犯數(shù)目的
static int statu2int( int statu )
check則用要判斷的罪犯列表、他們的關(guān)系數(shù)量,與輸入的假設(shè)犯罪組合進(jìn)行比較,如果成立返回1,否則返回0
static int check( int men, int num, int condition )
main中,循環(huán)所有組合,依次判斷題目中的條件,
如果不符合,就continue;如果都符合,則打印出當(dāng)前罪犯組合
下面看具體代碼
- #include <stdio.h>
- #include <math.h>
- #define NUM 6
- int statu = 0;
- enum man { A=0, B, C, D, E, F };
- static int statu2int( int statu )
- {
- int i, retval = 0;
- for( i=0; i<NUM; i++ )
- if( (statu>>i)&0x01 ) retval++;
- return (retval);
- };
- static int check( int men, int num, int condition )
- {
- if( num==statu2int(men&condition) )
- return 1;
- else
- return 0;
- };
- int main( void )
- {
- int guess, i;
- for( guess=0; guess<pow(2,NUM); guess++ )
- {
- /*A和B至少有1個人作案*/
- if( !( check( (1<<A)+(1<<B), 1, guess ) || check( (1<<A)+(1<<B), 2, guess ) ) ) continue;
- /*A、E、F至少有2個人作案*/
- if( !( check( (1<<A)+(1<<E)+(1<<F), 2, guess ) || check( (1<<A)+(1<<E)+(1<<F), 3, guess ) ) ) continue;
- /*A、D不可能是同犯*/
- if( check( (1<<A)+(1<<D), 2, guess ) ) continue;
- /*B、C或同時作案,或與本案無關(guān)*/
- if( !( check( (1<<B)+(1<<C), 0, guess ) || check( (1<<B)+(1<<C), 2, guess ) ) ) continue;
- /*C、D 中有且僅有一人作案*/
- if( !check( (1<<C)+(1<<D), 1, guess ) ) continue;
- /*如果 D 沒有參與作案,則 E 也不可能參與作案*/
- if( check( (1<<D), 0, guess ) )
- if( !check( (1<<E), 0, guess ) ) continue;
- for( i=0; i<NUM; i++ )
- {
- if( (guess>>i)&0x01 ) fputc( 'A'+i, stdout );
- }
- printf( "\n" );
- }
- return 0;
- }
復(fù)制代碼
編譯運(yùn)行
dorainm@lfs ~/workroom/c/conseq $ gcc -o conseq2 conseq2.c
dorainm@lfs ~/workroom/c/conseq $ ./conseq2
ABCF
dorainm@lfs ~/workroom/c/conseq $
犯罪列表出來了:)
[ 本帖最后由 dorainm 于 2007-9-3 05:28 編輯 ] |
|