|
发表于 2004 年 10 月 19 日 20:32:21
|
显示全部楼层
此类东西俺一般只用电脑算
7 i5 c' _# \$ {
. }$ W( |- ?7 i+ ?! g; G1 L- K2 F俺滴脑子只需要想如何让自己快快乐乐的过日子
' P" _* y( c3 A# t; E; h' R4 N! _* N8 Y2 w
3 R4 m; b$ c/ {/ J* F8 M
----------------------------------------------------------------------------9 ?3 N; z2 ?- x5 k6 c
using System;" B2 @* X: g1 O& F* \# m
namespace netsafe.math
( e. S7 U1 S. f9 g7 r{6 k5 e( A. U' w; X1 G
public class ayst
0 {: `( h7 U8 p9 L6 I{
~1 g9 n+ [; k: p/// <summary>% c9 T) X' V% ]( s3 ^/ R
/// 问题中的所有元素; T0 a. d4 u$ w9 u3 a K( U
/// </summary>
+ E- _3 T r, W" o( ~* \0 d0 K& a7 dstring[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"},- s( h- A% |# g8 W$ H9 |7 Q# e
{"挪威人","英国人","德国人","丹麦人","瑞典人"},: ]1 x% E9 b6 `- g: h2 h) F
{"DUNHILL"," RINCE","混合烟", " ALL MALL","BLUE MASTER"},
* A1 c' X, w) h{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},
4 d* ^' T+ }5 ]6 g: H4 x b) ^{"鱼"," 恐龙","马", "鸟","狗"}};
! v2 B7 R7 O. W# g' x. t. V6 {/// <summary>/// answer用来存放答案5 m" R, M1 c9 ?& F5 o
/// </summary>
& F n* D7 l7 j5 t, Lint[,] answer=new int[6, 6];. G* ]9 i2 z' P2 ~9 W5 [% y
int[,] ALL=new int[6,122];# X# n( r2 p0 y
int count=1;$ X# b7 A" t6 Q. ?2 y
int nLevel = 0;
& h1 l. F2 m2 q; r, s- a" x j9 \, kint[] List=new int[6];
: x R( i# K% {% `% I6 b% ^public static void Main(string[] args)
" t9 c; P2 [. W" Z- f5 l5 a{/ ]9 e P" d" l! Z9 s: _% l& M: ~2 j
ayst c=new ayst();8 Q% D# J0 D+ ]/ i: M
c.p(); ///生成全排列到all" }2 g& E K# I% ~
c.run();
# p% Q# d5 P# \% n/ V) Q$ vConsole.Read(); /// 按任意键继续( E2 i+ m5 l% A7 S0 }5 n
}
) \/ |5 d5 X4 [& \3 M" bvoid run()! d. D- m! {* D6 x: [
{
$ O! D1 o( n) ], b! Lint i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序
( ]# e) ]# b- ~9 R0 ^" Vfor (i1=1;i1<=120;i1++)///房子
v( z) L; J& }2 U$ `# X! ~{
2 y. C# g# K9 i i6 x4 i" I///9 、挪威人住第一间房子* x9 @7 R0 u" A8 C; D
///14 、挪威人住在蓝房子旁边3 Z# ^1 r/ E& r0 R/ w; V+ E# T4 \
///不满足条件就短路
# `9 U& h9 L @1 u0 N///
* s1 u; u! W2 X. I4 G6 [. Yif (ALL[2,i1]!=2)continue;
9 c2 q5 h2 R( ^( ?for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);
) g. L- K/ Y3 e# t9 @for (i2=1;i2<=120;i2++)///人种
" U3 k q$ \: K. Q, c/ V( ? U- G{ ) y+ r5 @/ s0 U1 L
for(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);
* ?- L1 |, h, N+ O/ h; k8 X///9 、挪威人住第一间房子
8 i$ A' x; w/ i$ Aif (ALL[1,i2]!=1)continue;) s: \* P" q, p1 F* Z
///1、 英国人住在红房子里 ) G6 |9 T/ E. ?6 l) Y" ^+ l3 C" ~% G, ^
///
1 V, N4 @* p4 P: S; fif (find(1,4)!=find(2,2))continue;: G" b5 r1 j3 L; H! y( R
///4 、绿房子在白房子左边 - O; Y+ u! ^, l+ b
///
* Y5 Y: |0 f) w. A" Q+ T2 ^if (find(1,5)>find(1,3))continue;# ?& ^- A3 @7 s8 A3 Q4 t# I9 Y
for (i3=1;i3<=120;i3++)///烟! G; k: z4 b2 Q, D9 E# w
{
8 B3 v7 Y2 v8 J: ?( V; Lfor(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);% A$ L8 ^6 f g Z
///13、 德国人抽PRINCE烟
& R1 q5 _ k: W P9 I1 f" ?% y///
- n( I/ [7 `8 T; kif(find(2,3)!=find(3,2))continue;
: ?# J* p& B5 o2 W' X8 u) x///7 、黄房子主人抽DUNHILL烟$ i. k# D( m1 F s$ d
/// 7 k4 I+ U1 g- `8 u
if(find(1,1)!=find(3,1))continue;
8 p e' O4 o" G+ t* J. qfor (i4=1;i4<=120;i4++)///饮料$ Q- v- R% r* ?
{
& s1 l- U! _' v0 |7 rfor(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);; j* @0 ]) v2 c! ^6 J( U% U1 y
///8 、住在中间那间房子的人喝牛奶 & _$ L* h' p9 _3 I
/// : O) K8 V$ S8 A; h6 @) ~3 t" `; x
if(ALL[3,i4]!=4)continue;/ w8 U; \/ o' U/ f l0 C
///5 、绿房子主人喝咖啡 - k; [3 \' ? U. V- m+ }6 z
/// : Q& i5 _$ b9 ^" n- [
if (find(1,5)!=find(4,1))continue;' _6 ?7 O& L, o6 h' t, B
///3 、丹麦人喝茶 + L6 j1 g4 b0 C, a: C
///
2 D& l$ `8 K x, q/ E! Rif(find(2,4)!=find(4,3))continue; v2 p* w. [+ t% O' E
///15 、抽混合烟的人的邻居喝矿泉水
/ T4 d! N# y( |if(Math.Abs(find(3,3)-find(4,2))!=1)continue;
. \: p3 q8 n' `///12 、抽BLUE MASTER烟的人喝啤酒
" I% U {3 k0 e3 w" d7 {* R///
" F$ A0 w$ W1 ~0 w/ Tif(find(3,5)!=find(4,5))continue;
( n" n; q, s& K% O8 ]for (i5=1;i5<=120;i5++)///宠物
' s. h; d* N, \4 P" V{
0 j$ w4 C7 f* W9 Xfor(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);# ^4 m0 W, Z& ]4 K+ P: T
///10 、抽混合烟的人住在养鱼人的旁边1 |9 H* ]& @3 C% G4 p
///
2 N2 |5 M+ j* S* [3 p. oif(Math.Abs(find(3,3)-find(5,1))!=1)continue;
' i+ J* E6 ]0 L% w, \/ Z///2 、瑞典人养了一条狗 * e+ D4 Z. E, i1 i, I; X% h
/// & J# m$ h7 C: `+ f6 }
if(find(2,5)!=find(5,5))continue;
* }, f' g. E& B1 }6 n! L///6 、抽PALL MALL烟的人养了一只鸟 % j5 M3 ]6 G$ Q4 U6 y6 _7 X
/// 8 S1 @1 h0 ]8 N- u ?
if(find(3,4)!=find(5,4))continue;" s4 W3 y6 Y* o/ |: ~" W: k& ]
///11 、养马人住在DUNHILL烟的人旁边
# ]+ h" Y; a7 Q* ?- d- \5 S( v///
) y, k! H7 j5 L9 R0 kif(Math.Abs(find(5,3)-find(3,1))!=1)continue;
; a# N! d$ L3 I' ?///
$ u1 I/ v+ }# ~- a///能活到这里的data,当然是答案喽
7 q) a. W. x/ N2 Q1 K6 d7 |; I///
( Y6 o+ e9 i/ }2 t8 v$ F+ u& jwrite_answer();+ G# |1 b+ I6 y8 D* I4 `
}% W" c) i" f$ e
}3 g- c: h# b" F. a
}
9 r# F7 U6 O; `9 [}8 e$ K, i! f$ {
}3 I- H' ]1 v& Z
}
6 H/ i l. F8 M" `9 G$ k/// <summary>
5 _8 B/ g" S* o" O. K1 O o/// 非常典型的用递归实现排列组合算法。% v: J, d4 [2 t6 A
/// </summary>
. H2 h) q X$ t" o+ G: g E7 Kpublic void p()
# d' p; E" T& X- x, X{
/ g3 Q& h% V. N4 Nint nCount,nJudge,key;
* J; Z7 ?6 l) u5 `2 wnLevel++; K1 Z, w) |- }. }, r( p
if(nLevel>5)
% T" R6 ?. r% V" X{
6 B' D2 ]9 y6 X. }' Y( G$ u G3 hwriteall();///有一种排列就写到All数组里
* g1 x1 T Y/ r2 x2 H) J R, enLevel--;
. O9 r) \8 P9 hreturn;
1 ~8 w/ ~& ?+ w/ l+ q/ Q; E}7 x1 A% a# ?$ Q7 m* h- E% I5 |
for(nCount=1;nCount<=5;nCount++)
3 q. |( i) R! ?5 t, [{1 {& ]; n& J) ~3 K! v# c" v
key=0;, ~* G2 b" C7 ~: [* V& U7 _+ r
for(nJudge=0;nJudge<=nLevel-1;nJudge++)3 L1 `6 `' h, P( d' Q
if(nCount==List[nJudge])8 R5 ]- b$ R* {( ~: @
{5 {: O1 h W2 `8 Q7 r' v
key=1;; l' A- ^4 ]' j2 w
break;- V8 J7 \5 S* X" I
}
# h9 O8 M0 s3 m# yif(key==0)9 Z8 t/ n: T, d+ p
{
9 `/ _7 x+ H2 G9 ~; GList[nLevel]=nCount;/ S; x, z8 i1 N( B
p();) V3 s; u: }7 T, w3 Z7 D2 N) {! F1 s' \8 z
}
% t6 h; g0 K- U7 X}
, T$ n; a ~9 c ?$ J* enLevel--;% Z2 ~$ c/ `! r2 U' }
}
8 M3 a$ U% S% ~/// <summary>, F9 I$ t& a0 Q6 @ L9 Q' f6 f
/// 写入all数组. D, |6 h7 J5 ?/ V
/// </summary>: D5 _: h! S4 a: V2 ]
void writeall()
( ^8 k& S) X8 t* V2 D+ s, `{9 k# L# o9 ]% z4 V, e% k6 X2 U' Q
int i;: T9 r7 S) A/ Z) Q( r
for (i=1;i<=5;i++)
. e7 A% ^% P/ `8 { R{
" Q: G9 e2 ~4 T) H; g9 j8 D1 eALL[i,count]=List;, S/ H7 y$ ?3 R7 M! O9 N
}
6 l7 u: ]! x+ t9 Ucount++;
+ ~5 s0 b! j( A: i+ G5 ?) _}
7 z8 y: Y2 l" o8 e$ oint find(int i,int j)
z+ o: m9 h, ?+ B- o{
' S3 ~5 P0 D5 ]int k;1 g/ Q n1 k$ N3 S/ y
for(k=0;k<=5;k++)
+ C$ i5 Q: D' l! ]; \# y% U{
% _: c5 P) V& Y! ]6 ?+ S3 d, }if (answer[k,i]==j)
7 w/ J; [4 W% O N5 C6 ]) b{
" n5 h" W2 Z: B3 N# Y+ w* C) @return k;
4 c2 H9 g* {% h) {+ O}; S/ {. x5 {, P* `4 [! i6 v6 G- {7 S
}
5 X g- S: o% s% N9 `( xreturn -1;
9 h3 r" l3 ~4 W k# u}
9 U* n) h& {5 ^1 {2 i/ c/// <summary>
* w! s/ t" M- J+ D& d/// 将答案打印出来" z+ {9 T; n+ ^. m3 r) j- n
/// </summary>
$ N& Q( p; @6 Svoid write_answer()
e- o& T: E! h2 [, ^( H; }{. ^7 G/ A. [) x. B& q
for (int i = 1;i<=5;i++)
# f6 Y n5 e% X" l{* M, x. T2 Z1 [
for(int j=1 ;j<=5;j++)7 z$ {7 l# a/ K) P4 X
{
6 V) B9 s: v+ u- B- e( w8 S7 X% X0 CConsole.Write(data[i-1,answer[j,i]-1]+",");
6 M2 N2 c: T: E( l3 L}1 o& m+ s' \& W+ c' M8 i# n
Console.WriteLine();
8 T! P- P6 }& U4 y3 C% N- ?$ Y}; { r4 _* T0 X; J& p
Console.WriteLine();/ H3 _$ r& ~9 \( X& y
}4 ^# s0 l9 u# T+ ^" m, F4 K
}
8 B: {' G& o$ G2 O; u1 P} |
|