|
发表于 2004 年 10 月 19 日 20:32:21
|
显示全部楼层
此类东西俺一般只用电脑算! ~& R+ P4 s9 N% S4 c. J0 s* ~0 Q1 b
\' p! L. C; r俺滴脑子只需要想如何让自己快快乐乐的过日子; I* o/ R1 v! ?
: }; q7 D2 `4 C
Y3 l& ]. m" W% [9 R6 w( R
----------------------------------------------------------------------------: g' c1 B" e. }0 s4 w' K
using System;" \% V( R% ~' t% b5 X8 [# d
namespace netsafe.math
( D% Q# t4 {% Z( B1 k7 w# V{
+ u& r9 Y2 Z3 O- _' p' |public class ayst
7 Y8 f# Y: B r! t- e{
8 b) t( b& H( `! Z7 b V/// <summary>
U7 z$ K& J& o+ Q, T/// 问题中的所有元素- o% v% t. Y! U- E3 M) E
/// </summary>2 n) m0 q, l! j4 \3 J
string[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"},$ E4 x) O7 M% T4 `4 h% u5 r
{"挪威人","英国人","德国人","丹麦人","瑞典人"},1 ] M' T( q. J& Q* u! w
{"DUNHILL"," RINCE","混合烟", " ALL MALL","BLUE MASTER"},
+ W0 E$ i" f* k: T' |6 A{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},8 f5 a( ^( S) f. t1 t, V$ k
{"鱼"," 恐龙","马", "鸟","狗"}};0 M) i3 e" P$ x! u" i$ r* V
/// <summary>/// answer用来存放答案) {4 T( d8 }: `# N
/// </summary>
( a; h0 w j( K; ~& Cint[,] answer=new int[6, 6];
4 T S' |( E% a Gint[,] ALL=new int[6,122];. E( o4 u. t! r* s" A4 u5 {; M, X7 q
int count=1;
1 @' J+ ^6 V8 f- I; c' Lint nLevel = 0;
0 s2 ?. J$ e3 t8 R- S4 e6 Wint[] List=new int[6];5 {2 ~$ {4 y, `$ D
public static void Main(string[] args)
2 g. E3 O8 N- \( c2 _$ L6 g5 K{
& b% i4 J l" K0 h Rayst c=new ayst();5 x6 l) Q" w7 A9 Z
c.p(); ///生成全排列到all* _$ e% ^% e) q4 k. L$ I1 ^
c.run();
3 K5 s9 }7 R- T$ n8 r2 MConsole.Read(); /// 按任意键继续
, a4 @: t2 |; X. P# V( A; x9 S8 z}/ u% b7 j% L7 G% _- D9 e% x6 a
void run()
5 @1 R4 w# j; |{
O M8 e0 A8 s% i9 iint i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序2 j# o' g6 y# R' Q; k
for (i1=1;i1<=120;i1++)///房子
* q3 ]+ A0 `& _2 W- t{
% Y# I1 ?, b# e/ V5 b///9 、挪威人住第一间房子
% I+ e) V& x2 s, V6 o) r' i///14 、挪威人住在蓝房子旁边5 @2 F8 G @% P8 ?" p2 V. E
///不满足条件就短路# `5 H, W& z& S- P2 g
/// & @/ F0 f9 L9 {" B( }4 H; H
if (ALL[2,i1]!=2)continue;
3 f9 s' b; r( F' ]+ V% dfor(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);) b9 b$ }7 X' S8 \& O' H. Y
for (i2=1;i2<=120;i2++)///人种4 i% U9 K, X# l) D6 D$ Z1 x8 {; Y _
{
/ A I0 Z# i" ~+ ?% Tfor(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);
! n% L8 u$ Y3 V; |/ E///9 、挪威人住第一间房子
5 ~& ^( \4 N2 M/ U9 G( pif (ALL[1,i2]!=1)continue;1 ^5 x% y$ R' q) C/ j& X
///1、 英国人住在红房子里
4 u1 r7 z U9 }7 {/ \ _///
$ d0 D" Q* x! n/ v7 a( Iif (find(1,4)!=find(2,2))continue;6 h+ o7 M) {; J! F% N$ t
///4 、绿房子在白房子左边
8 C) |5 b9 }( ?/// 9 \: X; ]! O9 g; S9 o% B
if (find(1,5)>find(1,3))continue;
1 m; g6 u: P) @4 vfor (i3=1;i3<=120;i3++)///烟5 D" f% y; P" y5 ?) h
{
$ x, F: v) {+ y# @5 M2 v2 zfor(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);* B5 ]; d- r/ ^& [7 B, M: X- Y
///13、 德国人抽PRINCE烟/ r8 {. {( B0 T
///
. i4 T- S3 N0 x c3 x2 q* fif(find(2,3)!=find(3,2))continue;
% p0 o l O: H; s& _2 M5 o///7 、黄房子主人抽DUNHILL烟
6 }; r3 S! @5 \6 f, k [5 W/// % l. j1 _3 {! s" x
if(find(1,1)!=find(3,1))continue;; D. _4 s, w" q' @6 p% }! f
for (i4=1;i4<=120;i4++)///饮料
2 k v! b q1 E" C{ ' J9 I" X$ C) {9 Y+ C3 ?
for(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);
% k* Y; ^$ R" Z& l& o: Y///8 、住在中间那间房子的人喝牛奶
- m$ E" w V) H* ?! I- O///
w: Z! K% |3 z8 s/ Nif(ALL[3,i4]!=4)continue;3 e/ C4 G2 S. q2 H% S L
///5 、绿房子主人喝咖啡 ; \4 Q9 v: Q( u* ?' {
/// & [& k9 c: O; U0 |' j; q t
if (find(1,5)!=find(4,1))continue;
S3 [3 k s. r" O4 ~* O///3 、丹麦人喝茶
. W0 y4 J' Q& \) g: U! T8 ^) T5 N///
3 k) K6 D% c4 z, y+ X3 Qif(find(2,4)!=find(4,3))continue;& B0 i. b4 V+ n0 U+ Z
///15 、抽混合烟的人的邻居喝矿泉水
4 Q! z8 T, [- d4 i% ~% A$ r( Aif(Math.Abs(find(3,3)-find(4,2))!=1)continue;, L" h3 }. c* w8 \ T8 A; O
///12 、抽BLUE MASTER烟的人喝啤酒
/ e% r- L' i. L& i2 I1 Y///
* ?+ z! e( [2 s, ?$ p. cif(find(3,5)!=find(4,5))continue;
' F9 \- D r6 y5 w' ]) Jfor (i5=1;i5<=120;i5++)///宠物+ L, ]. W# p/ N; ^+ {
{ E0 K& \/ d8 d4 w+ q
for(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);" f% S7 O F9 l
///10 、抽混合烟的人住在养鱼人的旁边
' B3 C$ t7 }4 G+ g$ ]/// w/ h5 T& U, t" b7 T
if(Math.Abs(find(3,3)-find(5,1))!=1)continue;, ~5 b0 i- |; L. _# X. n
///2 、瑞典人养了一条狗
2 b3 A5 E- v1 r& i/// 8 W# B: p0 x: Q& [0 T* S# A& R; k
if(find(2,5)!=find(5,5))continue;
. N0 R9 J# f: b2 g; j3 A///6 、抽PALL MALL烟的人养了一只鸟 ( F, J" {# J5 n5 K& d
///
' r0 U, v" @ g/ C4 sif(find(3,4)!=find(5,4))continue;8 Q" w7 L& P# f( S: |- D6 z$ R
///11 、养马人住在DUNHILL烟的人旁边 8 ]2 k7 `# [. n L% W% m
/// . X0 T0 G- L: o6 }% L9 J4 H9 `
if(Math.Abs(find(5,3)-find(3,1))!=1)continue;
, J2 _' B1 K. n9 x. {: ?///
: J; h/ A4 w( O! a& S8 |8 }- K5 m///能活到这里的data,当然是答案喽
0 p+ \( C1 S: z///3 Z- l, i0 d- A+ @$ |0 g1 F
write_answer();
, [: \3 N% R6 U( O- U$ w}
" I% j4 X, v7 k* z& J}, y7 U5 e- `: h. ^1 n
}' s* j! K7 N4 Q8 H0 ~9 l& H) F: f
}
* t8 o h/ q( [; ^7 p" l}
/ X7 p- l @# N7 v L5 y- M" f* ~}& S/ L( L0 O1 x9 e
/// <summary>
( g+ t" s4 a" l' M. m/// 非常典型的用递归实现排列组合算法。3 @# l0 i8 w& b2 m9 ~' f
/// </summary>
0 {* K9 _( v4 f7 rpublic void p()
/ T3 k; B$ t6 e: s{- w3 S: i. _6 }# z7 i# q. N
int nCount,nJudge,key;! o% M0 B3 c/ M
nLevel++;2 a' A; _' H h( I- _3 ~
if(nLevel>5)$ ]) K$ @( C0 ]% o
{
# K3 N! O4 q0 w8 R% Cwriteall();///有一种排列就写到All数组里
- e, c, r5 e# k( @nLevel--;6 P7 g% {; s! \: L7 i6 x) A! Q7 Y( D
return;
3 ^* r1 g2 }$ e y' q ? l}
) A6 t4 _3 L R/ kfor(nCount=1;nCount<=5;nCount++)
' v% x3 q( Z8 z, O) s{% J! I$ F, i7 e: B
key=0;
! X. y" s! o: u! [0 w! J" I2 y- H( Jfor(nJudge=0;nJudge<=nLevel-1;nJudge++)! e" b$ f* X% M( W: j: W, {
if(nCount==List[nJudge])
# J! H. Q" {& ^0 k- r{
/ m6 n8 u5 y, @key=1;, | ?$ C# [7 N" c- p
break;
- E6 H2 d) q4 D. w4 U}9 S% ?( a1 ^" D
if(key==0)5 J( n S1 i+ Q2 Q7 b
{
# J' ]1 C9 ^- K) A. ]! iList[nLevel]=nCount;
" z, ^1 P, F, C! Q4 }p();
$ ]! v3 q5 F; [1 H- C& o) ~+ P& y}# f9 W$ @' X6 J$ S* B ?3 A
}. K' j6 q8 W% w3 Q# Q( D
nLevel--;
3 O9 [2 E7 J L1 z+ n; S3 V}
- m m9 K4 g! u- p# ^0 W/ \: \" D/ H/// <summary>, h0 N5 T, g1 {/ p/ n
/// 写入all数组
) f9 o: T" F( L/// </summary>
# A* ]# ^: @& _0 _3 H/ wvoid writeall()
# V) z8 @4 x& ]$ f% E. k8 Z{
6 S# H2 e0 m$ Q8 v1 ]int i;5 @# `( @ G8 c F$ B; R$ {# C
for (i=1;i<=5;i++)# A% U( j0 v# t- f. |' s/ H! b
{
% b" ~, q5 E) @) n: R$ X2 h6 yALL[i,count]=List;
$ h0 a& d8 v t: K$ w, o; ^}
$ G. O' e$ V7 {( ycount++;
( m/ F2 a; ]9 n% P5 P2 C1 v}
6 u% W, [, k; P2 F" hint find(int i,int j)! \* y, T5 i- K
{
7 o$ \* j+ _6 w+ V5 |: E$ `int k;. P; d" q* X* ]: T p m9 O2 H
for(k=0;k<=5;k++)
' d/ U+ P6 Q) H( \{
2 ~8 j' H0 M$ |) a, [if (answer[k,i]==j)
1 U5 @4 o" l4 L8 z{* ~, t) l5 r9 b# C' G I' I
return k;
* L1 W, l) y0 A; f; o/ Y4 x}# v% c5 W) `$ l) Q9 u6 [2 k
}$ h8 z9 c+ D9 f$ \" A/ }5 J
return -1;
9 A# H+ o+ n$ G2 r8 ^" |( n}
& p3 s- _6 O# I! b/// <summary>0 o! c* V: J; t m* Z* W
/// 将答案打印出来
# t0 T9 c; v4 L! x8 p: \/// </summary>4 f, j9 K x7 G) ^! V
void write_answer()
|( k9 p- B! s$ r4 S4 @ Y2 o# B{# G; K9 \9 t7 i x5 C9 v
for (int i = 1;i<=5;i++)
6 w; [3 f; ~3 @{* a+ Q; o+ w. [. j" {. u
for(int j=1 ;j<=5;j++)
9 ?2 B" v3 H) e. J" }3 A( Q$ [{
; F8 I A7 |( m/ S1 CConsole.Write(data[i-1,answer[j,i]-1]+",");7 P9 F) Z, Q: o5 ~3 W
}( f& H: E: T2 o+ ]" I6 y+ C
Console.WriteLine();# V9 k) S: P" f0 z* M( s0 \
}" o5 g, {+ _/ a/ {7 ~7 \
Console.WriteLine();
& _! Q6 f: o& N$ X$ A- |7 V1 T}
5 I7 z3 i: c- q( O}! F! q. v, x8 _6 Z
} |
|