|
发表于 2004 年 10 月 19 日 20:32:21
|
显示全部楼层
此类东西俺一般只用电脑算4 e# `( h3 p) j& k$ l$ p6 {
- D+ Q# S5 J5 {! k9 g
俺滴脑子只需要想如何让自己快快乐乐的过日子- m4 E' L: t+ Q
& W2 @# t/ b9 \- W8 c0 j; J5 b0 Q4 A
% R& B6 w% ~6 A
----------------------------------------------------------------------------& z( T4 M) [0 k% m- [
using System;+ o! m" g' J8 b- k0 h6 h! |7 O o
namespace netsafe.math1 v1 v* X/ V( B6 F
{3 H8 j8 a) h1 `; ~( ~0 n
public class ayst
. {8 I/ m" q) w4 @& E, N, }{2 J1 ?( I! O! n& h+ L# i
/// <summary>, s. u* h* d3 B9 a' ]+ K
/// 问题中的所有元素
y; `2 K: ?) C6 {2 |3 |/// </summary>
5 k: u3 V! S$ m0 Astring[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"},
& T B! V$ ~3 Z7 ]0 u8 t{"挪威人","英国人","德国人","丹麦人","瑞典人"},3 x/ G4 P4 ]& G
{"DUNHILL"," RINCE","混合烟", " ALL MALL","BLUE MASTER"},9 U1 X5 q& A7 e1 N; S: C
{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},4 m9 u4 _( Z. C5 ^. o
{"鱼"," 恐龙","马", "鸟","狗"}};# x# f" n" L. W9 i7 J
/// <summary>/// answer用来存放答案
4 X6 @* y4 h8 a9 S/// </summary>
$ R& l, t) V* o G: q4 C6 eint[,] answer=new int[6, 6];
4 I' E* U# o9 z# y+ r- Y# p" _4 nint[,] ALL=new int[6,122];; w* L' S9 n# z
int count=1;5 V( f+ L- O; N
int nLevel = 0;# Y+ n2 l- |* S4 b
int[] List=new int[6];
2 S, j% O h" ]* _( Q1 Mpublic static void Main(string[] args)' [: B7 d/ f, |- @9 l
{
* J- d* k: L: ?3 [ayst c=new ayst();7 {1 ]- h, R, P7 |6 t
c.p(); ///生成全排列到all4 ]: U; t v7 B/ @2 T& b; t
c.run();
! [1 F, {6 p7 D' m- f+ j( qConsole.Read(); /// 按任意键继续. r0 X2 ~- s2 B0 A% P
}! t$ v/ T% G6 u& h7 K
void run()
* l4 J) c- Y$ U2 S Q/ Y: S{
! w7 S) D. B# o5 o" Vint i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序
( P! T5 v( P: J2 sfor (i1=1;i1<=120;i1++)///房子
& Z* s% l0 ?3 P{
8 |9 K, l1 P; O- A" I///9 、挪威人住第一间房子2 h) L+ c* O8 Y
///14 、挪威人住在蓝房子旁边
4 [# b9 W# `2 L/ Y' }1 A7 O- X7 @///不满足条件就短路& m( R7 {' R2 O1 Z) ?8 t) G7 k# [
///
9 Y5 g. X- @0 V. Fif (ALL[2,i1]!=2)continue;2 Z! K. d! `# e4 o3 z
for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);6 U+ c1 C2 }, V+ e1 B
for (i2=1;i2<=120;i2++)///人种: _$ o( B8 o) m+ x; b
{
$ g# p1 N/ m5 O. g3 O3 U/ w% zfor(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);
" A3 K/ E1 K7 Y5 M. V///9 、挪威人住第一间房子. W2 r; B$ x. A' x3 S8 z1 y2 ]# f
if (ALL[1,i2]!=1)continue;
% C5 T9 n) k4 J0 {5 G: c7 U. e/ w5 O///1、 英国人住在红房子里 . s( n M* M2 K) ]2 p
///+ e% ~6 ^: d( x4 N0 _% M
if (find(1,4)!=find(2,2))continue;8 X2 ^+ h: o2 a- D; N# H
///4 、绿房子在白房子左边
h: k: A$ Y$ s; T a! x///
! V) j8 I1 [- p& r& o& r0 _8 fif (find(1,5)>find(1,3))continue;5 r1 ]# J* G; M
for (i3=1;i3<=120;i3++)///烟
4 w6 Y) n4 s: i x{
: ^7 a: V- \3 Sfor(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);
) w: O+ S" \& ?) ^$ n3 ~! Y, b% X///13、 德国人抽PRINCE烟
- e7 U' x, D) a6 c& R M$ ]///
1 x! K! J& |* nif(find(2,3)!=find(3,2))continue; x& H. \1 i8 d* ^" T' H
///7 、黄房子主人抽DUNHILL烟% g0 s0 ~1 O Q
///
7 k7 m, x6 X: N$ Uif(find(1,1)!=find(3,1))continue;0 q9 N1 n, S+ s: @
for (i4=1;i4<=120;i4++)///饮料
% t: ?# h/ P* [{ 5 A5 @" `( E& e) T
for(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);- U, |! z" e: I
///8 、住在中间那间房子的人喝牛奶 ( k! w. |, G! C
///
# |& {5 s9 I; ^9 N! t3 iif(ALL[3,i4]!=4)continue;0 t* r+ O" p* t
///5 、绿房子主人喝咖啡
% ^7 u& u, r6 {- Y! H/// 9 d' w" J3 R- a3 b4 I$ E
if (find(1,5)!=find(4,1))continue;
2 s& m6 Z( u9 W5 g& [/ F" I///3 、丹麦人喝茶 / ~9 l' [) i& L! _0 g( P
/// & C _1 y+ ]& \. f7 q9 c ]
if(find(2,4)!=find(4,3))continue;
3 e- K. C0 ~5 g* B. W# {/ `///15 、抽混合烟的人的邻居喝矿泉水
, N' H1 U4 ~# ]" q* }9 A! m3 `* v) hif(Math.Abs(find(3,3)-find(4,2))!=1)continue;/ H, F. L" {6 H, }
///12 、抽BLUE MASTER烟的人喝啤酒3 f; h2 Y, S6 T5 w \+ R p
///
. n* c& L0 r. L5 b6 Pif(find(3,5)!=find(4,5))continue;+ R; t" B6 w) ^+ j
for (i5=1;i5<=120;i5++)///宠物. v" k6 |5 d( ~% V3 [8 ~
{ / G* v: I) f+ t5 k
for(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);
& T8 E( t8 C J4 n4 o3 o///10 、抽混合烟的人住在养鱼人的旁边
) k, y4 |5 s; {9 ?# @/// 9 W+ }) g( s+ f
if(Math.Abs(find(3,3)-find(5,1))!=1)continue;4 ^. a5 n3 p: M0 f
///2 、瑞典人养了一条狗
1 e7 R; o, x$ @- G# P, G: v/// n/ B4 H7 X3 I& X/ e
if(find(2,5)!=find(5,5))continue;
0 T8 y, I! }' ?7 k; P///6 、抽PALL MALL烟的人养了一只鸟
$ O* I! {' d D h2 f4 D( A/// + }% [; {# [) y. K8 W9 M- ]* Y/ W. D
if(find(3,4)!=find(5,4))continue;+ y- h1 `9 q, x( b, b
///11 、养马人住在DUNHILL烟的人旁边 3 u! ]# g3 A0 q$ i' A9 ?# k5 H$ C
/// ) v+ Z* O7 a- }' w$ t* m) @
if(Math.Abs(find(5,3)-find(3,1))!=1)continue;
X' c6 q/ u+ X3 C) c2 B; y- \//// P x- Y; J+ d4 q( i
///能活到这里的data,当然是答案喽
" ?* k0 h+ f/ |* v& ?' O9 Y. N( j8 c///% ~3 w" _ _9 j/ C5 v
write_answer();% u7 W+ K3 k7 o4 A
}% J* q' H: A1 f9 g* G
}
1 J8 b! J6 c! f. @* I* n# u1 _}
8 t) {6 n) s2 H" F7 L4 y) h, d' v}
/ d5 _6 s8 r6 y4 `: K% Z}
: |% ~: Q1 \7 J% Y) }$ B( h9 v}
2 z' }& G8 h4 G3 G% d9 n5 y/// <summary>+ m& h2 v1 S: P
/// 非常典型的用递归实现排列组合算法。
1 g" [, H8 R1 N2 V& V/// </summary>
8 A5 ]* n G1 x; }: Bpublic void p() ; v; @- S7 H7 P+ `6 b$ a
{
% n3 m; X7 g' t1 vint nCount,nJudge,key;
4 j! m* O. Y* T# D! fnLevel++;& P0 ?& g! u' y { W3 u
if(nLevel>5) U* z* I9 T' E8 K8 X+ E
{
. [5 G! P7 S! t5 gwriteall();///有一种排列就写到All数组里( ]* c$ S- m. O# F
nLevel--;7 J9 h1 V y# J4 [ d
return;7 j, K9 o. w8 m! j
}
7 K3 f; J- |, ~7 x" ~( J( ^for(nCount=1;nCount<=5;nCount++)
1 h' m O$ t- ^" a{! M6 r1 g9 g" ^, Y0 h/ S. C3 m
key=0;
; R6 u2 B8 G0 q/ `1 J7 Efor(nJudge=0;nJudge<=nLevel-1;nJudge++)
# z& j3 P$ g; s# c6 K2 f3 eif(nCount==List[nJudge])
) R! g2 n* j n9 W1 o( ]* Z{
3 S9 v) b0 G) ]% N0 y/ {key=1;- N( e( P! \0 A. z" g, ]3 [
break;3 C7 t3 J" F, W" \' t. V8 C7 s- `
}5 U, n, `; x- J6 a$ u$ D
if(key==0)
u) J! p1 E5 ~2 f, z3 z. ^{
# o7 r, I+ {* F) s8 n0 Q( YList[nLevel]=nCount;
/ f/ m! R# Y) g9 Op();
+ r, V9 b% F; K1 `8 J, F2 I}
, b9 o" C" |( t0 K; k}% c& h- {% w! Z
nLevel--;9 E& D0 ?/ P0 E" N! _( Z
}. d+ {3 L. Z5 o H
/// <summary>
' v, k$ ?7 {. n5 b9 B0 ], ~& F* V/// 写入all数组
+ v4 l+ D8 p/ @/// </summary>
: j8 q5 B" ]+ S, n/ G% }void writeall()
5 n5 y# h. {: m8 [; Q& G9 j2 T{
6 s8 ~+ ~- l$ m+ O( Xint i;
5 u. V; e: u3 U7 X: }0 B) ufor (i=1;i<=5;i++)# v( J V4 f6 G
{2 W8 |7 z/ W, C$ w
ALL[i,count]=List;7 |4 ?' l; f' I+ ]& |) U
} Z- g2 N# n5 e _
count++;
' r1 g" ^8 _! t4 R+ P, u, t2 P}, v7 j# d/ h- f, i; J0 |3 }! S
int find(int i,int j)
3 _& w- ]1 A N' m% m2 t{
) T3 `: N* U6 ]; Y) C1 q9 ^int k;* Q, x# Y- N! C4 q* a0 u4 \4 l
for(k=0;k<=5;k++)1 K5 u7 T7 L3 J& Y6 \
{
2 _) q4 n% B0 D! z* V8 uif (answer[k,i]==j)
4 Y( N& O B: K5 Q; v. _" w{
D3 w/ X3 ]* {& o4 }5 nreturn k;3 ^ h( u+ e8 U5 H. U3 }
}
3 @, R/ t: G$ G7 _' j% F}. f6 J/ x; f+ Z1 U, Q, C7 |
return -1;& t6 y, E' D9 ?6 ^% F( z
}* c: M( r' J( [$ ]/ {
/// <summary>
- j$ s- D1 `, B0 O1 s) E/// 将答案打印出来) ~0 o+ C/ \) g7 J4 I
/// </summary>
s& W; @- B% a1 k' cvoid write_answer()- f# ?# i5 Z, j2 ?$ _" S
{
( |# X' f2 P Cfor (int i = 1;i<=5;i++)
& h' T" h j1 s8 b4 N0 n7 [/ A& c{
2 \7 v- _% k0 S& F6 f/ ^1 L* y2 Qfor(int j=1 ;j<=5;j++), g7 Z+ Z* c, g" n7 p" \3 E. `
{
- N1 X) `0 Q( e) |4 k2 L7 jConsole.Write(data[i-1,answer[j,i]-1]+",");
2 q" ^/ z& `) X" V}1 P4 D! o% C9 C. z8 o! F
Console.WriteLine();
' C+ e5 T- z' k/ R}0 b$ C" f4 X# E$ T2 ^; X, E# ^
Console.WriteLine();
: T& P( y+ w: Q- @}9 S3 ~3 k. }7 b; g5 {& [+ o( D
}% ~ t% x/ C# g
} |
|