|
发表于 2004 年 10 月 19 日 20:32:21
|
显示全部楼层
此类东西俺一般只用电脑算
5 i+ {4 r# G* \
. J! u; Z, Q, H4 G俺滴脑子只需要想如何让自己快快乐乐的过日子# l" F& G: z! U7 g" n, b3 K
! y: u) s( t+ z( E/ v. j; I# m6 c% o e
----------------------------------------------------------------------------
/ U+ p0 r' X6 x1 h5 b5 l) ^using System;: W( _+ t1 ~( Z, A* {
namespace netsafe.math. D! I/ K: I h3 v4 ]
{( N" k( p) L5 `) P- Q8 [# |
public class ayst
4 v3 s; g! A$ `% C |, Q; M( p{( g+ {5 _1 D% }" c8 K9 N
/// <summary> d3 l" _# S7 ~2 A) f6 E2 c# [
/// 问题中的所有元素
- E) \6 z0 M9 Q }7 V; ?7 Z$ q$ c* G/// </summary>
2 P: F' _! |$ B) g% O' Tstring[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"},) G& I/ D6 v, X, `9 \2 w
{"挪威人","英国人","德国人","丹麦人","瑞典人"},
2 l) j8 J$ J" X4 [) b{"DUNHILL"," RINCE","混合烟", " ALL MALL","BLUE MASTER"},6 z0 D2 x/ {( ~% H* |. @
{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},
0 T0 \+ g- q! y4 ?8 F{"鱼"," 恐龙","马", "鸟","狗"}};' b9 v) D& o) X: |
/// <summary>/// answer用来存放答案
. _1 H! V: m1 k$ Y3 P2 }! c/// </summary>
& D0 M/ C/ N6 ~, qint[,] answer=new int[6, 6];
& j* K- x5 @$ z6 q0 I q' uint[,] ALL=new int[6,122];+ P5 l7 i9 N; y9 k
int count=1;" W; G4 C9 Z! v2 u7 H% b
int nLevel = 0;
0 p; o1 w6 J6 s# b/ W/ Mint[] List=new int[6];/ p6 ^% o1 T( d( Q
public static void Main(string[] args)
% F2 K/ w8 v \! h{
4 S5 A. V) z/ N8 Y( e, H5 q! K; nayst c=new ayst();
0 f& |/ d& b, G; T0 Mc.p(); ///生成全排列到all+ g+ U9 s4 O- d% ?" k1 \8 n0 |* z
c.run();) C$ d4 x& a! | E0 ^1 Z: N
Console.Read(); /// 按任意键继续
9 Z, s3 t" ]2 Q* r$ C}# D1 s, C1 N$ L! J7 b" X. j
void run(), O0 E7 T7 r* t
{
; S- {) d' H! V& e: ^int i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序
2 s, W* Q; l. i# X1 q/ pfor (i1=1;i1<=120;i1++)///房子5 a( s( p9 S" [5 j# j. d' m0 J
{
3 C& h4 j+ |; S! s///9 、挪威人住第一间房子
4 d! `; l9 B4 E5 g7 h7 c" C% A///14 、挪威人住在蓝房子旁边
( A4 s. p/ ?# N5 |' @3 k- E/ {///不满足条件就短路
6 R6 [8 o ?7 l5 @/ Z* i# s///
3 z R5 t4 J, k6 U: eif (ALL[2,i1]!=2)continue;) ]9 X [ }% I7 d; S" }
for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);
; C$ f/ V$ Y" lfor (i2=1;i2<=120;i2++)///人种7 F0 r$ \( s/ L2 L2 N) t
{ 4 K. f/ N6 U9 ]% C
for(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);3 f; \1 c" L1 V2 X2 N2 ^
///9 、挪威人住第一间房子
- Y8 f t" D/ pif (ALL[1,i2]!=1)continue;4 e0 A! n; l; N: V
///1、 英国人住在红房子里 % |9 O8 w$ u# Y6 u3 n1 a* r/ C3 s
///( k6 s" ?! p; N3 z4 f: Q
if (find(1,4)!=find(2,2))continue;
9 J1 ~4 `, A- ~& @///4 、绿房子在白房子左边
4 z) |% N- S' v$ i+ }! m/// 5 i% v& `0 {; |0 @6 F- I5 }5 C7 G
if (find(1,5)>find(1,3))continue;2 y8 _$ |; t0 B. m
for (i3=1;i3<=120;i3++)///烟/ A7 S+ ?6 V7 | H/ \+ Y
{
0 S7 l0 L2 Q% L/ n2 o$ o9 \for(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);( \6 ]8 r6 |- V6 G/ D
///13、 德国人抽PRINCE烟, z. T! W2 i: D* N ? ^7 y
///
* D( M) _- ~3 G" ` C' W+ Bif(find(2,3)!=find(3,2))continue;# j5 u3 j% V3 Y. I7 F* G
///7 、黄房子主人抽DUNHILL烟# i9 v6 p# X' ]# J1 f' Y3 N2 k
/// 0 b( ?0 `5 K4 n" ^% {0 \
if(find(1,1)!=find(3,1))continue;. j, H. ?1 j/ H% J
for (i4=1;i4<=120;i4++)///饮料
) t9 X2 p: Z& ^0 I, C{
* m7 P: R: U9 @2 t$ E0 xfor(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);5 K m! Q9 y3 T' T& |
///8 、住在中间那间房子的人喝牛奶 9 V: V' Q! K h* H6 C
///
: i( ], L$ s8 I6 x K) ` ` Bif(ALL[3,i4]!=4)continue;
( w* L1 D+ ~( G6 T) F7 K///5 、绿房子主人喝咖啡
! o4 |4 }$ r0 b/// ( X6 L; m3 R1 K2 a
if (find(1,5)!=find(4,1))continue;
% o2 t# D2 N/ F9 t0 P: G4 o///3 、丹麦人喝茶
' }/ N% B# S. v q( W* Z///
6 @- N: e) v" m1 P2 Dif(find(2,4)!=find(4,3))continue;3 I( B, M B+ H/ a% W& L/ {
///15 、抽混合烟的人的邻居喝矿泉水
7 a) r: @/ K4 l; O' B3 t9 \if(Math.Abs(find(3,3)-find(4,2))!=1)continue;) k6 w5 w( \! T6 ]# C8 `7 I
///12 、抽BLUE MASTER烟的人喝啤酒
" ?( @$ j1 U# _' ]- o/ `" G/// + y/ M7 `& a) }* C% o5 e, H4 \
if(find(3,5)!=find(4,5))continue;
u( o* }/ W: m; t; Bfor (i5=1;i5<=120;i5++)///宠物
: K, U5 ] ~5 s! Q$ ], W8 o{ P4 |+ c2 G5 \' a. X$ V' U' V
for(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);
, A& Y. J; F1 P" V( L1 B///10 、抽混合烟的人住在养鱼人的旁边
/ A* N* F" \% E8 E% c& G/// 0 P9 k4 S3 E! a( u b& |
if(Math.Abs(find(3,3)-find(5,1))!=1)continue;
, P, Z W x" E% ` Q' O; z' j///2 、瑞典人养了一条狗 0 H0 x o( Z8 z# g
/// " P' l9 {8 `$ @
if(find(2,5)!=find(5,5))continue;/ W; h+ F( c+ [' Y- E2 O
///6 、抽PALL MALL烟的人养了一只鸟
7 [( ~; u3 m; B. r# T- w///
* ~; \, S) H+ H; a% K' g! e) H6 P8 Uif(find(3,4)!=find(5,4))continue;- X/ ?) N% ]* @# P9 f' \7 T- C5 C
///11 、养马人住在DUNHILL烟的人旁边 . S4 O( ?: y/ k6 t
/// 6 W3 L7 T( u* K% b, G
if(Math.Abs(find(5,3)-find(3,1))!=1)continue;) U1 W6 N# ^' Q& `& C7 J4 U
///7 Y3 S# `, m; G0 R: x7 Q# @) R
///能活到这里的data,当然是答案喽
0 Y% g8 i- G, z/ n. |3 D. I$ w///# M# n& c5 j) B' n& X* u& J
write_answer();' ]2 Y) H f/ `
}8 `; R1 h# }4 k
}
1 m* ]. T. H; Y! A7 N: A- V- s$ L}- X/ }! W+ u! p. M; t }7 i
}- o7 h# D5 H: Q0 x
}8 `: c# E" H8 u5 @ [& Z! P1 U
}
9 |9 A. D9 ^8 O [# R ^0 T B/// <summary>
( {, Q* z% y. E) @# t6 ~/ B/// 非常典型的用递归实现排列组合算法。
4 W9 E. W3 q: }2 a/// </summary>+ a- J1 |9 y" S1 T. L4 h2 U1 @
public void p() ; E( U. L* w$ x; f% ?; I, q
{
2 h: E# T9 S/ y2 Uint nCount,nJudge,key;
- u* |' a: Q: {9 O, bnLevel++;9 f# C$ ^, F) \# L1 {: l# L9 C
if(nLevel>5)6 T% h0 m. W2 s8 Q' z) h- A& j% a
{, t2 L2 X4 e! D" _0 N
writeall();///有一种排列就写到All数组里
3 M+ P2 o+ j% BnLevel--;
* O; f' v! a, x. xreturn;! o& }# Z$ H, E8 D1 v" K0 C
}* |( a8 P1 t/ E3 ]' l
for(nCount=1;nCount<=5;nCount++)
( b3 b& X/ K y. y( {{
( R. S2 t+ f- B' R& Ckey=0;1 R0 ~9 }3 e6 {3 A. X# g
for(nJudge=0;nJudge<=nLevel-1;nJudge++)8 e! N7 ^2 W5 q: x
if(nCount==List[nJudge])
5 I' H* H- H1 l{
7 m4 u8 w0 a& _' K, R& X& R! vkey=1;
' f+ V7 W0 F( \7 cbreak;7 t# C9 B% a- Q7 H2 g/ p9 ^1 L/ V& v
}
: N: Y y/ s! A/ Q o% g, Vif(key==0)( u! d% ]" o& ~$ s
{7 V( m- b# h6 b1 \( b6 O
List[nLevel]=nCount;
: m, W; U, Z( X* g9 x/ R' zp();, _' r0 H; { X$ D: E6 M6 Y' P
}
) p+ A/ x f3 h7 P}
+ R9 Q' m5 F/ \( r- k" j8 e9 _5 ]8 XnLevel--;
( D! k6 y9 J N9 l( [# u. `7 _9 L}
* c& p3 `6 k+ g" b: g; X/// <summary>. q/ D( n Q& u) c9 r' n
/// 写入all数组
* a; o+ J' c0 e' N6 O F/// </summary>
8 Y% B# c! ?7 F/ p. H2 G% G5 Wvoid writeall()( n- P3 y5 l' }+ y
{, U% @9 [5 M2 Q- D; ^. |/ V
int i;
% S* a* G, `5 v; q5 V7 g$ ~for (i=1;i<=5;i++): e3 V* I1 O4 \ p( D7 }( @# h Z
{
' {7 V' O& ~6 C) D- r7 KALL[i,count]=List;% z- Z1 g5 s" _" l
} 4 l: N" n. {8 N6 L- O1 A$ Y
count++;" I9 ~. S- Y0 m
}
) C) [& N4 H& Q8 g1 H! j2 l. ^/ bint find(int i,int j)
: M# N q$ t5 U7 I) D( R* s% I{
# ?/ [' n2 I% Y1 N$ \2 aint k;6 N( o6 c8 I3 \: _/ g
for(k=0;k<=5;k++)( I: Q: {8 l/ h) ^
{
! b: i$ c% y! q4 L& Y( Jif (answer[k,i]==j)
6 I7 x! f( n% s+ W* Q{
3 c: p V, n, ~return k;6 Q2 I) B( j& U! e5 q" q
}; D9 ]& Q% @2 R
} [7 a; w# A+ t, L u) m
return -1;
) J& s* m8 z& i* h6 `% j% i) ]}) B$ u6 n9 g, p* t, h# D
/// <summary>8 z, M1 p$ k8 s# k3 @2 L. N
/// 将答案打印出来+ U; ?/ \2 [# \7 C z L" U
/// </summary>; a3 z1 t- s) S& w p+ O; X3 a
void write_answer()
- {! i) ]$ f" ^' p( k9 a{! ?5 m4 @. F( b3 E+ v9 o3 B3 c
for (int i = 1;i<=5;i++)
4 ]/ q% ^1 s/ _3 i{! f$ P" R4 g! Q$ N) R& r+ y
for(int j=1 ;j<=5;j++)
! z3 r" {4 }4 Q! W, X/ @ z{9 Z+ K) ~4 |8 t( K3 D
Console.Write(data[i-1,answer[j,i]-1]+",");
9 o9 A' z; p( W1 V+ ?}3 k' H7 m$ W# R% \4 p# V
Console.WriteLine();' J9 ] m. ^2 q- h
}& k! c$ X- s( r" s% L
Console.WriteLine();
" }# ^ L- ]9 U( B' s}. Q- r9 W7 w7 G, [
}
% s, N% X6 e+ |: w& [} |
|