|
发表于 2004 年 10 月 19 日 20:32:21
|
显示全部楼层
此类东西俺一般只用电脑算
& u" }" x8 D6 A" E3 q! c+ q& ]* E1 w- t1 z% w( L, y9 O5 p
俺滴脑子只需要想如何让自己快快乐乐的过日子
% J- \/ b3 P, {) C& @2 s6 \: d: ~
, O2 q. c% \5 N% n2 [
----------------------------------------------------------------------------( n: ^8 R- g0 W- O0 m/ y6 T# r
using System; Z2 ?6 F: |; W: A
namespace netsafe.math
5 k, F/ m3 [/ Y1 x" ~. N2 b{. N, R9 `! z% S
public class ayst# D5 z+ x# T1 V) e- h1 @0 R
{
0 P9 J) ?. E A1 c( X7 |/// <summary>
# Y+ N5 G, W' P9 J/// 问题中的所有元素
/ B: J( N; p0 m. a/// </summary>
: n/ M$ u* b1 O3 t$ g; d T+ sstring[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"},
+ e, g5 E/ r& f{"挪威人","英国人","德国人","丹麦人","瑞典人"},6 d* ], W2 @# q" E0 {
{"DUNHILL","RINCE","混合烟", "ALL MALL","BLUE MASTER"},
3 ^& @# A0 j4 o{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},
3 S9 s" J# g6 ?7 F' o' M1 @/ ~/ @{"鱼"," 恐龙","马", "鸟","狗"}};/ Y& Q! r. W- \$ a$ I( O
/// <summary>/// answer用来存放答案) p/ H6 N7 |: D3 U
/// </summary>
0 p+ K6 ?, l; z& s, x' R0 uint[,] answer=new int[6, 6];
: u9 W8 t0 M U! N+ Mint[,] ALL=new int[6,122];
- R" Z6 X3 n7 G; e1 sint count=1;) G, I( _: e0 ]. k
int nLevel = 0;/ e* `1 } w( r
int[] List=new int[6];
) d8 d3 r+ q% F% k2 Jpublic static void Main(string[] args)8 B3 p& b6 Z s7 c- L5 ^. B& O
{
2 t) i% D! W$ b: wayst c=new ayst();+ R \; t6 a1 q
c.p(); ///生成全排列到all0 v7 M) N5 F0 ]+ K% s
c.run();/ @1 `/ j4 o: O) r1 k* m% e
Console.Read(); /// 按任意键继续
X2 n' E" O/ S}* k( H: T4 c9 l7 u5 G
void run()' n+ u( X- j' a% B. s- b1 S
{
# E: E8 V9 w% W8 g7 kint i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序0 a) @7 T B2 f& m$ {5 R" K
for (i1=1;i1<=120;i1++)///房子
( M$ |4 D7 m9 } X{
8 U4 ]' B F6 P6 @- n( y, i///9 、挪威人住第一间房子: h9 i/ R5 Z6 S
///14 、挪威人住在蓝房子旁边
2 M3 O' L4 M0 f3 M8 v///不满足条件就短路0 F* |' ~- @0 z n& k6 u$ }
/// . S0 R* c# k6 o* S% E
if (ALL[2,i1]!=2)continue;1 {& |; {- T3 n5 j
for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);
/ d9 b% m. f$ a1 K, U# C9 efor (i2=1;i2<=120;i2++)///人种7 U& }9 q7 O0 b4 O& }$ v
{
8 q. c7 c: S/ i% zfor(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);/ C4 r s. E1 `0 c, \/ {2 l
///9 、挪威人住第一间房子( K' v1 f$ F" m: n% u: E
if (ALL[1,i2]!=1)continue;) M0 V1 w: r8 s, y* e8 y5 A
///1、 英国人住在红房子里 * _ d' q1 {! E
///
R5 C) A/ l' e, d* t* Fif (find(1,4)!=find(2,2))continue;; u: [9 G8 X6 B) j2 N- g7 o* \
///4 、绿房子在白房子左边
. B4 w" X% P; T" t& }5 z) i+ e" C///
5 o( \$ Y1 ^$ @' G! Iif (find(1,5)>find(1,3))continue;7 A7 R0 t& g9 G7 M; ^8 q4 t
for (i3=1;i3<=120;i3++)///烟
+ j( f8 y( h0 h( Y* e{( X/ U# G( r4 w4 f; S
for(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);1 n: v5 w* A5 v K0 V0 [! }( `
///13、 德国人抽PRINCE烟: S3 ~8 C$ `9 }; r. f1 d0 p
/// / l# j8 Z% c/ ]
if(find(2,3)!=find(3,2))continue;8 [; C9 K9 A% V# Z( v, x
///7 、黄房子主人抽DUNHILL烟& Z5 j8 a' |* V Q
///
, q/ h0 D' x# _. _% Cif(find(1,1)!=find(3,1))continue;* i( L8 |. N+ b; _
for (i4=1;i4<=120;i4++)///饮料$ I. j" q4 R/ S& v
{ 0 W# f4 T7 {( ^# U$ S+ }6 P( H
for(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);
. }0 {$ s0 F4 S///8 、住在中间那间房子的人喝牛奶
2 I7 i" o% f# U/// 1 [4 s# k! P; W
if(ALL[3,i4]!=4)continue;
8 g+ a& g: R) ?' F/ S///5 、绿房子主人喝咖啡
* W7 W/ |& j: T% @% w4 i& r/// 8 Z# G7 e" ^9 s: ?) }
if (find(1,5)!=find(4,1))continue;* d: u* o% ]- F5 Z
///3 、丹麦人喝茶
q/ g7 P; x. B* e% I5 f! j/// , m; Q! z! p2 a/ u, T% R3 h% F- }4 ~
if(find(2,4)!=find(4,3))continue;
5 B9 a$ U1 f( D0 N% x///15 、抽混合烟的人的邻居喝矿泉水
+ @! j6 b; W P2 o. g& [% o+ q' G) e5 Rif(Math.Abs(find(3,3)-find(4,2))!=1)continue;; x' M# o0 K# Z0 v6 m; P$ c
///12 、抽BLUE MASTER烟的人喝啤酒
# t7 N/ Q+ e# s///
" {1 r9 A8 D( {2 Gif(find(3,5)!=find(4,5))continue;
1 S8 L C+ ?2 c- o) Afor (i5=1;i5<=120;i5++)///宠物5 A& x* A$ `3 p: m8 r" L! Q
{
. h$ a+ `5 E: F! A- v6 Ufor(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);8 {) e+ o+ i5 P( F, ?5 J
///10 、抽混合烟的人住在养鱼人的旁边 v e' X3 W' B9 z
///
/ W: k9 Z& I7 z. @if(Math.Abs(find(3,3)-find(5,1))!=1)continue;1 M8 t- j& y; a% C) i# r" Y8 V1 D
///2 、瑞典人养了一条狗
& m$ R) ^. z& U# S. o/// % @- t+ L6 Y/ T: K0 U
if(find(2,5)!=find(5,5))continue;0 u7 F) ~( K7 x" \" k$ F1 J
///6 、抽PALL MALL烟的人养了一只鸟
8 ]! Z9 \# Q( o+ j- y/// ' C, b$ ?5 P0 @& w
if(find(3,4)!=find(5,4))continue;
1 c4 \: ?, M2 s: `# L* f+ |///11 、养马人住在DUNHILL烟的人旁边
* r% w& d+ |+ A: ~" O5 o7 ~- K- s///
8 o9 _5 j; Q! L/ k" Y% zif(Math.Abs(find(5,3)-find(3,1))!=1)continue;3 L0 r" }7 w/ b0 b
///4 J2 k; n2 P! ^
///能活到这里的data,当然是答案喽
2 N5 T/ i8 `- V1 `6 o///, e) n$ m7 O: y
write_answer();' S$ E4 e# i/ \7 [
}5 S5 C9 }4 o- k: }( _4 c
}4 J: V1 I* Q9 X' Y
}
) P0 f4 f$ j9 q7 z! k}
& Q6 V: n2 u. H( s# }9 u2 M}7 n K7 Q) O$ x$ Z! E
}
! D; q7 S: f$ U' o- c/// <summary># l7 r( b8 w* x" w! P
/// 非常典型的用递归实现排列组合算法。; q: Y* _+ b, i" b
/// </summary>
) M3 X- N# K' m& e: J( b7 a# wpublic void p()
" O* n# |/ b0 j' [4 c( p$ P4 Q{6 o# U# T" [3 z
int nCount,nJudge,key;
- i: A! q; T' X2 _: pnLevel++;
" K& C9 [6 T4 h4 Lif(nLevel>5)8 L) v7 d8 I5 e8 N& p: b5 R( H# P
{
6 L8 p$ _5 e; D* [ Iwriteall();///有一种排列就写到All数组里/ e. o. U& g. p- ~! ?
nLevel--;
3 [/ R5 Y5 Y# E4 C6 greturn;
8 u1 i! v+ |5 H8 e9 J% w}. f$ w5 q$ q/ j% K4 h: X
for(nCount=1;nCount<=5;nCount++)
' N" d" o' r& _# I5 ^{+ M% k# {' F9 U$ B% I
key=0;& e, k' L" X$ r
for(nJudge=0;nJudge<=nLevel-1;nJudge++)) }1 ?7 O9 u" n9 ]% Z: w# c) q2 o
if(nCount==List[nJudge])
) ^* ]6 V E" Z' B{
: F' C) }$ o! Q1 v0 K4 jkey=1;
- R# h4 G' b4 V* s7 X. tbreak;
( Q9 V) e8 F% c& T O0 }+ w}
# _- A5 n% a: @1 [7 Zif(key==0)
9 S1 Z5 D/ u7 U1 T2 K{
( i1 w+ r& F3 M% h' gList[nLevel]=nCount;
4 ]! {" a% G: E& n7 O6 u8 I( zp();5 \, p9 n, r6 g
}
0 X, @% V3 n0 f( V}
! [7 g% n- w% _8 c( hnLevel--;
1 s( p& X r! N# z `' Y+ D; ^ a+ B5 ]8 N}
0 h0 `( J1 o3 ]: T& d% S: |" i/// <summary>
1 \' S: ?7 Y9 N- t& C/// 写入all数组
' O0 H' V9 y0 m9 ]/// </summary>, |8 H7 O; T( L
void writeall()
F. F: g9 s) S' D) T3 U{
3 y) E8 s" `/ i7 f7 `- |int i;# s( \: m, o+ B
for (i=1;i<=5;i++)1 D) w1 X! a' T$ G3 W" X. R3 E" n
{
5 L1 s, U1 Z% o' T. ]' |ALL[i,count]=List;
& [, {6 s& m t/ d7 ?/ w} ' g% b1 ?. c+ ~! n& Q- ^
count++;
0 I6 ]7 o$ W0 V- V3 Y, G}8 b5 K& b" p8 z# M7 i9 l0 ]8 d
int find(int i,int j)
+ e6 F; [$ z b; X3 g& D1 H: ~{
0 y" x5 Z4 j/ O% `int k;
* j' Y0 d1 c; h5 s9 N0 ufor(k=0;k<=5;k++)
% B+ E% }5 e5 P0 z7 q7 Z{! Y* q0 ?0 F# H& a5 _
if (answer[k,i]==j)" Q- V. z+ ?: q4 }
{
& L. Z0 a9 |1 s% f! Jreturn k;% l3 O4 B7 v3 ?( i
}
3 u! N+ g/ h1 V, m6 b) U}
3 P3 C7 \- p! T2 u' c' freturn -1;' j' _$ {0 D4 L
}
5 F) O( D1 t7 G. _8 d, j+ [. [. ]/// <summary> j5 p- X% K9 k7 t6 F B
/// 将答案打印出来5 b3 }' g5 \1 \' a! ?
/// </summary>- X7 y& S9 N, }; K$ K
void write_answer(). ~8 `5 P1 [+ W1 K, _8 K
{ O4 F' L Z0 \# o
for (int i = 1;i<=5;i++)- b- e2 y/ L0 }2 K0 M/ Z3 }
{ t- W; {. c, F4 }8 p% J
for(int j=1 ;j<=5;j++)
! P& k7 C6 F% U U{
. V7 J& k' D2 w/ m2 ]. F8 }Console.Write(data[i-1,answer[j,i]-1]+",");2 o; H0 V; q" Z# S6 S* v9 u* g+ u
}# ~) @3 p& g* Y0 C% i9 V6 \+ Q
Console.WriteLine();3 @# ?0 Z! [$ D9 G
}
3 [6 V7 e5 M, N8 O3 T* l+ A& sConsole.WriteLine(); ]: V v/ Q! E; I" O# Y
}
# \) q* y0 N# ~/ J H: L) c}
# e9 V0 v4 Q* A* z; U! }$ V4 ^} |
|