|
|
发表于 2004 年 10 月 19 日 20:32:21
|
显示全部楼层
此类东西俺一般只用电脑算/ U" {: j# G4 k0 M+ K2 b
8 t' ~: i% L2 Y" V) j
俺滴脑子只需要想如何让自己快快乐乐的过日子& t; ^& z( R: z( Q/ o1 O2 i+ T
1 \: t" u" {3 } x, a7 l: p1 k" ?. ^2 e6 Q
----------------------------------------------------------------------------4 G% \. ?; e* h' p8 x/ O
using System;/ w, ~: r* D7 ]$ `+ p
namespace netsafe.math7 r9 h F9 y2 V
{1 }+ ~: T2 _! I; `6 B9 N/ n6 o
public class ayst# w; T a$ f8 b7 C
{. [; l3 e5 G5 m# j$ Q
/// <summary>
# t0 d+ W! v( r: R, H3 c/ F/// 问题中的所有元素
$ V3 |/ y7 x6 p Z6 H T7 y/// </summary>
# J: h9 h+ i- Bstring[,] data= {{"黄房子","蓝房子","白房子","红房子","绿房子"},
; v& T, j! {4 h8 N7 \{"挪威人","英国人","德国人","丹麦人","瑞典人"},0 Z7 _0 z8 K8 I" o8 {1 j0 P
{"DUNHILL"," RINCE","混合烟", " ALL MALL","BLUE MASTER"},+ F6 H/ ^+ L, b) _% @( j
{"咖 啡","矿泉水","茶","牛奶"," 啤酒 "},: U0 }5 R B+ Z# O& G
{"鱼"," 恐龙","马", "鸟","狗"}};
3 S3 I, l2 R& V+ a. y/// <summary>/// answer用来存放答案
& M0 t6 [/ V* _3 P! P- G/// </summary>
; k5 ]1 c8 s" B# D* \* G2 Uint[,] answer=new int[6, 6];
7 u( _, k% `, W& x1 \& Kint[,] ALL=new int[6,122]; {8 h' z M) {2 b% m7 k' W; q0 n
int count=1;
) n' ^+ K$ n9 B7 @, g% kint nLevel = 0;, f2 z* Y& N2 C
int[] List=new int[6];
5 u% d8 m7 d8 M% s, |public static void Main(string[] args)9 Q" V0 S0 A2 i! @8 Y7 E( r8 d
{
6 P, f! j: p1 a }ayst c=new ayst();/ J. N0 T: @" ^7 M2 O% [
c.p(); ///生成全排列到all
# W. e" o( M+ K) B6 S6 P$ V! uc.run();
9 _3 [ u) h% \Console.Read(); /// 按任意键继续
9 B' [) g2 f; {7 M2 i- `3 H( I" W7 S}
( L0 g2 K: c; H9 @1 [8 R% Jvoid run()+ u' y# {' @# v+ Z4 u0 `
{
5 A3 c2 z* P: a$ [; o% oint i1,i2,i3,i4,i5;///通过逻辑条件顺序的有效选择来优化程序& H+ ?- l' x: O+ d
for (i1=1;i1<=120;i1++)///房子# F7 j; d0 E) B2 |* E0 u
{
. O1 n" D2 d+ o4 |5 y: }' J///9 、挪威人住第一间房子
1 U0 k$ p1 y8 J///14 、挪威人住在蓝房子旁边: Y6 L' c/ ]8 `4 ?& y4 X1 Z* k
///不满足条件就短路1 W4 X6 u/ l) H% V* \, u
/// $ \% A+ y/ G8 F
if (ALL[2,i1]!=2)continue; i3 }7 z5 \3 }
for(int j=0;j<5;j++,answer[j,1]=ALL[j,i1]);
4 v5 K& p0 \( t$ c& Bfor (i2=1;i2<=120;i2++)///人种$ ~ T% ^6 {! Z/ C
{ 0 n& M, N+ \4 ^: ?. c
for(int j=0;j<5;j++,answer[j,2]=ALL[j,i2]);& O# {9 u6 V+ r H( F
///9 、挪威人住第一间房子
: m/ _4 ]" O) c+ ^3 mif (ALL[1,i2]!=1)continue;) @0 F0 k" q' e" Z: _: x
///1、 英国人住在红房子里
$ s( m& @' _5 H/ R% o///' M; b6 {7 { N' H# B- o
if (find(1,4)!=find(2,2))continue;1 C/ o' b* `$ X9 o3 B
///4 、绿房子在白房子左边
/ m$ x1 ]6 A. ] a& q/// - ~+ x' n; M: @
if (find(1,5)>find(1,3))continue;. I0 I% }+ ]9 l9 H0 p1 [1 C/ t' @
for (i3=1;i3<=120;i3++)///烟# [5 z* ?1 z# {! K% k# |
{5 `" I1 [ T8 b4 e
for(int j=0;j<5;j++,answer[j,3]=ALL[j,i3]);" n2 J& C; G" O" G" s/ m
///13、 德国人抽PRINCE烟8 A( C: T: P8 B; j! X4 ]
/// ' Z6 @ Y# {) ?- z7 V
if(find(2,3)!=find(3,2))continue;* v& q3 C; L0 }- Z
///7 、黄房子主人抽DUNHILL烟* p/ \0 a- w) H: B2 {
/// 8 G# S) p6 K( U* k8 R
if(find(1,1)!=find(3,1))continue;
, ]2 O7 ^6 e: m: l6 e- m }4 jfor (i4=1;i4<=120;i4++)///饮料' V* ]# ~/ f# r4 Z) v9 }' d, h$ D
{
) J4 m+ d+ l! ?! h9 bfor(int j=0;j<5;j++,answer[j,4]=ALL[j,i4]);
% u7 S5 n/ P1 L5 r' \: H///8 、住在中间那间房子的人喝牛奶 8 \ R4 r8 x$ G3 k% ~
/// 4 l' {0 \+ K+ W& z. ^: N! A
if(ALL[3,i4]!=4)continue;. u5 w3 g* f, m2 v2 X* F$ @5 f7 [
///5 、绿房子主人喝咖啡
; W5 p3 b7 c) [/ b: d2 a: h///
, ~2 i) |( j. o/ P; ]if (find(1,5)!=find(4,1))continue;$ N& v6 ^% F. D. l' q2 _$ s
///3 、丹麦人喝茶
x4 D( Q/ q7 f) s/// ' q/ J) C' C- {% g" |
if(find(2,4)!=find(4,3))continue;
4 S: j4 t+ _2 |# Z5 N# F///15 、抽混合烟的人的邻居喝矿泉水
$ Z, I5 H R4 Q1 lif(Math.Abs(find(3,3)-find(4,2))!=1)continue;4 S# z7 U \# i+ R( d2 e
///12 、抽BLUE MASTER烟的人喝啤酒
+ R5 c' |+ `" M j3 S/// : J; q; e; d$ R2 r
if(find(3,5)!=find(4,5))continue;
% `' {8 Z' j' B/ \$ q1 T& Ifor (i5=1;i5<=120;i5++)///宠物
' f$ n' D; v! P) O{ 8 r/ y: B7 f' r" s* w0 ^' \0 k. v
for(int j=0;j<5;j++,answer[j,5]=ALL[j,i5]);
7 t& z. F7 @1 |3 \& R- B( U9 }- U G///10 、抽混合烟的人住在养鱼人的旁边* Q+ R5 Q3 U( f& }
/// 3 z0 \; V; {1 M$ u, \4 _3 d+ |/ c9 E
if(Math.Abs(find(3,3)-find(5,1))!=1)continue;
& _3 z, G- n9 g1 D///2 、瑞典人养了一条狗
, ]3 C* h9 h2 Z2 U6 u///
6 P( j$ H# J7 q; Rif(find(2,5)!=find(5,5))continue;3 o0 r' {9 j! o$ {: L8 F) `4 z$ C
///6 、抽PALL MALL烟的人养了一只鸟 4 s% J* s0 N) S+ u- `) b& p3 [8 B0 P# w
/// 7 M3 ~5 }. F$ l. a7 \8 f& I
if(find(3,4)!=find(5,4))continue;( ^0 h6 I9 i( v$ @# [0 K" V
///11 、养马人住在DUNHILL烟的人旁边
. n; m8 P6 |/ ^1 [! ~8 i5 V0 R///
) @ }( e( O4 o) rif(Math.Abs(find(5,3)-find(3,1))!=1)continue;
/ ~# x7 Z4 o1 p: ?///' `6 U: O6 R% f0 @; f3 h k( n: `
///能活到这里的data,当然是答案喽
0 F3 s5 ]+ V* [9 \///6 l, @: a; M# l- D6 _7 x8 j$ i3 G A
write_answer();$ k5 o( G3 j i4 v8 |) J t
}( c. q3 }7 `0 s( o3 s
}
' Y% q6 k& x( n3 @}
5 s% @' x% X2 L! d: O}
8 Q3 e. x0 y0 f& e) s' w; K" V}
! l1 c, A6 g# Q6 a9 L9 }- a& Q% \$ n' G# X}
: g- j9 d: y- Y" _# O2 a5 W/// <summary>- b; p2 k" d) O
/// 非常典型的用递归实现排列组合算法。2 a. S, H( `2 e% ^) l7 {
/// </summary>2 N# h! D% C! Y" C1 ^% U5 p5 ~3 t
public void p() , n# r- _) a) T+ U& F* o: f
{
( q- X0 `2 H* N* _* {6 O4 kint nCount,nJudge,key;* \; W5 r4 b* Q c
nLevel++;6 C; T" r/ e' O5 ?, c
if(nLevel>5)
3 |6 q7 z* F; [8 {& \1 V9 q{
8 }4 ]+ R" l# L f" ?writeall();///有一种排列就写到All数组里 z! ~ H% l2 E3 }
nLevel--;
1 {' L3 u7 l& s4 `# E* z# Sreturn;
# n. w+ |; J+ a1 h}" P; v4 ^- x% H, K9 ~
for(nCount=1;nCount<=5;nCount++)8 N; x6 p$ x2 \) ?( t
{
- B/ g) F% N# {9 }4 ]key=0;6 T3 d, u. {* P% D& l5 V& d0 P
for(nJudge=0;nJudge<=nLevel-1;nJudge++)5 y/ h7 b8 ]/ I% Q- T/ y
if(nCount==List[nJudge])( p& _- U. ?5 z, H
{6 K: J% c; W% t% Z
key=1;
+ K" z. t8 N) x5 w4 X5 }( L7 wbreak;! h- i& |6 `+ \ _, ]: @8 ]5 B
}
) @- r9 @( Q6 t4 Dif(key==0)
( H# m* \6 J% N{! d0 J, |# m {/ J& b8 y; J
List[nLevel]=nCount;+ m9 Z- c" \+ e
p();
# ^% y- _1 W* u- N! c/ z* N}
- i) h) f9 }, s6 j6 j}
5 O1 F0 t+ R, b/ unLevel--;5 F& c5 N& {( e1 U
}2 Z# L4 t& _& T6 B; c! Z
/// <summary>
0 N3 ` u: K- Y7 V! W9 I/// 写入all数组
- _8 c- f5 a0 K! |/// </summary>
- s% f z7 s. p6 ~void writeall()$ u. p3 w) O0 J
{
4 \1 I/ R' M4 V) d, }int i;
4 Z9 ]4 M, p# @' w) I- o1 Lfor (i=1;i<=5;i++)2 Y- A2 n/ j- |! ~4 j$ ^& d
{2 e$ W# Z1 \, n# C" B5 ^" R. F) ]
ALL[i,count]=List;3 q& I- q2 U$ x; [& @- c* Q5 F
} N3 a! Z' X! y/ e" m" {
count++;1 i# B/ h& T; J9 ]. z P
}7 `7 D+ X& g, x7 ~
int find(int i,int j)
% T+ d+ r# `1 j6 y# N. ~) X{
$ C+ }8 n7 k* B" y" V, Xint k; U; e! Y1 g# ]5 _* X K
for(k=0;k<=5;k++)
3 f* ?/ S5 @5 e1 f3 }% i8 f{
f$ Y6 Z# }, r% J" @if (answer[k,i]==j)
6 \3 g% H$ a S% F0 Q& r{
! B* t4 |" i) I0 |$ jreturn k;8 h0 L% J# `( p. C2 W( N
}
# p" s" U* _' F) g$ y/ n}
- p9 y! A6 p. {6 n; g' H! S$ ~: sreturn -1;4 F9 R5 Z, N* z- A4 Y
}. @" B8 i2 a5 O- B
/// <summary>+ f$ _+ G& F+ }5 R" q0 p$ P
/// 将答案打印出来
: S$ T0 Q9 P$ e' j/// </summary>
" p0 a. o+ j/ E8 B) Z Bvoid write_answer()
5 {/ h" ?5 X! K- @& c{* w6 _+ \. ]1 U3 Y
for (int i = 1;i<=5;i++)! O) E0 ]1 u& t6 j! A
{- T1 T# V8 }* T! H8 T$ x. ^. {
for(int j=1 ;j<=5;j++)
4 S) |3 K* q0 j$ I. O) E" e{( q' y2 C- h' M" t/ y1 x2 B1 T) J
Console.Write(data[i-1,answer[j,i]-1]+",");
: G; M/ x5 V2 F V. L L6 @}) q. O2 Q( G* e" u& q! L: ~
Console.WriteLine();# x7 t8 g/ i8 u% c" c
}$ `' ^/ \6 v, E# Y
Console.WriteLine();
% a8 J: L2 k+ j}. s' @1 l) {3 ?9 c7 e# Q' D
}; i i% i4 E" E3 E* f4 `
} |
|