本帖最后由 厚积薄发 于 2010-5-6 18:40 编辑 " W% a3 c6 d: p5 n$ O/ x
$ W. N3 R# y+ p1 P" _ l/ zSorting It All OutDescription
9 O1 l, g# a1 v6 V0 z
( V/ y3 [" Z5 E/ L' O0 A. ]! NAn ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not. * e4 U7 Z) ^9 d" Z
Input
$ O0 U) r$ A) V# a9 s( F6 k$ H, O9 F3 H9 J, X( `
Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.
( K& s! O7 V2 POutput
) p+ q' y0 T8 i6 {8 F6 n& L" Q! f/ L0 Q( f4 k5 `8 P: \
For each problem instance, output consists of one line. This line should be one of the following three:
, w! c$ c' t+ k( a4 Z( B) y1 G5 Y7 Y& X+ |& Y- F: S: Q" `
Sorted sequence determined after ** relations: yyy...y.
& I, I# D# k: Z0 E" vSorted sequence cannot be determined. 4 w8 R p$ |( u( \& _
Inconsistency found after ** relations. 5 p7 A1 [( y$ }& A5 @
+ x4 D/ f' l( _8 e/ h4 ~where ** is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
" f A+ }0 ]$ h6 h1 I$ i4 w8 `; u3 B' a5 J
输入样例
# F; }' p- S4 j, ^& c4 64 k# Q0 N E4 o p0 X/ Z
A<B
8 W/ q6 I9 o+ i' kA<C' }$ ^/ b1 {4 Q
B<C# J0 y5 }; z! C3 n
C<D
, m2 c4 @0 @* \" S' oB<D1 c) q* g7 J0 t3 O
A<B
( l4 E' N$ R( s- ]$ g0 o3 21 P2 \5 ^9 I. {1 Y5 w+ h
A<B
" r, ] J0 u+ H- rB<A
& @, o) x. V. O- i26 16 c' l8 w4 D! i* V' H
A<Z: J1 g, B6 x& q& O2 U2 D! R$ `" x
0 0
1 J5 X' [1 B8 H: _
. m' S9 |. I8 ]- }+ T( ]输出样例 ) ^8 ~" c+ |8 q9 i' j
Sorted sequence determined after 4 relations: ABCD.
9 j& c5 Y$ X( n8 HInconsistency found after 2 relations. o5 [: o% D2 s6 `' S1 r/ v
Sorted sequence cannot be determined. 6 u' O7 }( a' Z' R9 H
Source
/ @; T" i9 [% @8 ~1 M% U
1 t+ n' B* W3 h" w8 E hEast Central North America 2001
" d H! W! O" t [4 ]程序解题1: . d5 y j ]: _1 w( x9 r$ |6 [
//By Jackie Cheung. V' X y4 b; J0 L! |
#include <iostream>
3 T- K2 _3 |5 R# _#include <string>
8 ]+ a) ~ M, c) @8 I# d#include <cassert>: S- J& r2 r4 l/ J, H$ w
typedef struct tagNODE
5 |$ z9 i4 E: _8 T; W- i2 q{
& H% f4 a0 Y9 Z7 T% s' H6 l char val;9 P( P2 l! C4 `! m
struct tagNODE* link;
/ C6 x8 o" P! W5 w}NODE;
4 p" `4 ~% ]9 C1 v9 N* G, rusing namespace std;
* ]5 L4 k# `: }: W. k; ^" wvoid Marshall(bool** arrary,int n). r, _* J: ~& J. s
{
5 ?5 y; E' |8 l+ H for(int i=0;i<n;i++)
( }; k% i# L1 V. f! o5 I {
5 b2 A3 f0 {! n. d2 U for (int j=0;j<n;j++)
8 h2 U9 y' h0 s% ? n {& p G3 T. ~& k. O
if(true==arrary[j]): ~ N: d. _& d# \7 y7 I. P
for (int k=0;k<n;k++)4 L' u1 s5 ~- X# R2 C
{
# N0 g" t; e. ~/ m/ s arrary[j][k]=arrary[j][k] || arrary[k];, d% s( K1 x3 A# u( u" M
}8 g5 q, S- X8 \
}
( g3 ~+ C+ h# j3 k/ x" G }! O( V3 i' p& `
};3 e1 U9 {( d- t1 s% u* F
bool SearchForRoute(bool** array,char Seq[],int nLeft,int nIndex,const int n)
; k8 i: {5 }5 X* {/ q4 W{
% _: {/ R+ K/ e6 i$ u Seq[n-nLeft]=static_cast<char>('a'+nIndex);
% T- N3 w- f* m J5 ~ bool bFlag=false;& d t0 d) h) A o
if(1==nLeft)
X8 b' q6 w i {2 G( E5 ?$ w6 M' r/ A! \: Z; u
Seq[n]='\0';6 u3 g" A `4 K7 m& \2 ?
return true;
9 ~$ K* ]3 D+ |6 q3 ]9 o- I, J- Z0 \ }; u, n8 A" O/ A8 w
for (int i=0;i<n;i++)) k1 `( f& U' h& @" a
{+ S) A* n0 i5 Y6 l4 b
if(true==array[nIndex])
- R4 ?$ I% t( e/ N {
, e" N4 T1 w' p2 u$ B
a: c3 e8 o1 r/ F u; w% {; F bFlag=SearchForRoute(array,Seq,nLeft-1,i,n);6 b5 u- I8 a1 C l/ N
}* R3 O# Z5 x$ H
if(true==bFlag)3 v& r* l: |" I5 f4 I
return true;8 O/ b C; |1 B3 Y s
}# d' A, G! i: p2 J4 U8 d# I, A
return false;# K0 f# Q+ R4 g* b S7 l6 U
};
* l1 L' E" ]+ Z# `- Rint main()5 d; @* F4 v9 P g! c
{4 o1 n5 J/ e* {
int nSeqLen;
! J3 H: }) K% Y- r& K int nRelNum;
3 H* b7 Y4 v. S1 A% f cout<<"Input the length of the sequence:"<<endl;' t. U/ A6 r/ Z) |5 Y( q
cin>>nSeqLen;( G2 _) i% A2 Q& O2 v" l3 D
cout<<"Input the number of relations between the elements:"<<endl;
8 [0 W0 K/ K# p, k cin>>nRelNum;6 }2 o( I2 y" O3 F. O# o0 L
//1:if nRelNum<nSeqLen-1,then the relation can not be determined!
( b% i3 h1 f! }8 g7 J' d if(nRelNum<nSeqLen-1)
" e( H/ ?# |- d9 w' E {* M( w1 ?$ ^( C
cout<<"The relation can not be determined!"<<endl;
E0 }0 Q( R: x8 J( s' \7 R9 p return 0;
1 a h2 R7 F2 ?1 ?0 ^% O }. g1 H) Z8 ~2 D$ }5 k2 a
string* strRelations=new string[nRelNum];
3 q4 E8 h* `, o% w7 ?/ k char* Seq=new char[nSeqLen+1];* K; J4 D- k5 |3 x+ a
bool** array=new bool*[nSeqLen];( Y, G- L3 S2 j; @/ U
' P2 C5 V4 H2 {9 k5 P- s
for(int i=0;i<nRelNum;i++)/ x% x+ [$ B- u T! a
{+ _) ~' t( i/ R$ l
cout<<"Input the "<<i+1<<"th relation:"<<endl;+ B, y. \0 g6 a! }' x' W8 @! P
cin>>strRelations;
7 [% k& j5 c$ `2 T8 Q' c }
u2 }' j, N: v3 o7 x: Y# b) n( y
3 J' d) H" k6 H+ F, Z; t for (int i=0;i<nSeqLen;i++)
5 m, c4 o4 G* E {
& f3 K9 _9 z, E# q) }5 m, @ array=new bool[nSeqLen];8 {$ U. P9 p- e. D- y4 B6 f4 ~
for (int j=0;j<nSeqLen;j++): c. ]; A$ {2 d
array[j]=false;1 T! N/ R" A* N @2 c2 _% C5 l( K4 C3 a
}$ u6 g+ O- Y" E6 Z+ R: i# Y4 l
//The main loop( f4 j5 Y, Y2 N
for (int i=0;i<nRelNum;i++)) E' Q7 y. | j, ~
{
+ m5 S' C4 Q {1 g3 }7 a char a=strRelations[0];
- s3 H# o7 @& Y, X char b=strRelations[2];8 v; J- t. ~% F- _7 R# `
assert(a>='a' && a<'a'+nSeqLen && b>='a' && b<'a'+nSeqLen);
8 h6 A7 R9 I7 z( d" k2 W array[a-'a'][b-'a']=true;
) @- A3 s' \+ N; d0 |+ W/ H' E# I; N) \5 o; E3 b
Marshall(array,nSeqLen); t9 b6 r! A7 v5 K4 T
" `0 D& Z6 ?7 u& `0 N" E# x
//Check for Inconsistency after every relation
9 j# M# [% `3 C( z; R for (int m=0;m<nSeqLen;m++)
7 L Q5 V P" F. Q& C {3 T, r, u2 T" r
if(true==array[m][m])
% F( g/ r0 ?; J; I {
4 A s: {- O: W: k7 ^ cout<<"Inconsistency found after"<<i+1<<"th relation!"<<endl; W2 r& R9 i0 Z. \
delete []strRelations;
. E8 k5 Z1 t% E8 E3 n+ J# @ for(int k=0;k<nSeqLen;k++)& ^# Q H: _( `7 N3 g8 i
delete []array[k];$ _0 h9 {1 P9 _
delete []array;
' p6 s3 B Y) a! E delete []Seq;
: e6 K2 {. O0 ~( F- _ return 0;+ I2 w( q5 e! E% d0 h* @' s
. p* [( F$ f0 x" }, ^8 M4 a
}4 b, W; ]! w! g, u. ^
}
2 P: o' A$ g2 _, p/ v/ C! B& t) m, r
0 q" d( a% B2 T9 v" }# g$ o9 @8 C //Check for the determined sequence after every relation $ \# l1 y6 r: E, @
for (int j=0;j<nSeqLen;j++)0 D7 }$ S7 j7 Z+ R
{
7 u3 u! J% J9 ` if(true==SearchForRoute(array,Seq,nSeqLen,j,nSeqLen))
( l% j/ l4 a4 O h* x9 s {7 z; _* l2 B2 W H8 y: _
cout<<"Sorted sequence determined after the"<<i+1<< "th relations:"<<Seq<<endl;
5 m/ u/ Y. x4 `5 e- D delete []strRelations;
6 G' y" u' L# y for(int m=0;m<nSeqLen;m++). t2 s9 |% ^2 d# `" l6 L4 y
delete []array[m];
1 {( ^3 t! X- F; Y/ u delete []array;
" B2 F' |2 P/ o7 | delete []Seq;' ^/ B2 _/ X9 ~8 a* m, {/ w
return 0;1 T( J2 W- d# N9 o9 p& Y0 k" Y7 L
}
{$ a. l5 ^" | }# _/ u7 {0 E& q1 F
. R1 U8 n& C; V* x1 u) t0 D: y& \/ `" |4 ]
}
. f+ y$ f6 O M5 U: Y //If the program has come to here ,then the relationship hasn't been determined!!!
$ w8 ?8 M$ j- h- o cout<<"The relation can not be determined!"<<endl;
: a" D5 t8 \( P; D2 [6 U delete []strRelations;8 G; \% G3 \9 y4 F. C' E
for(int m=0;m<nSeqLen;m++)
" m4 a# o- S0 |* |, h9 ~ delete []array[m];
( P4 z6 O" J3 B3 ? delete []array;' X4 D0 P- C. g+ u5 |1 W
delete []Seq;: U H* C) Z5 M
+ @. J$ q @# J% K' [" N; V& o return 0;2 W t4 h$ {: b `, P
}# z$ X6 m- _! R; c7 ]- Z
; @2 @& b' y8 Y8 o3 q& q
程序解题二:#include"stdio.h"
" D" K' I' D. P) [+ Kvoid main()* H% M7 F4 m0 r: W6 w* }
{$ q- k1 U7 Y' R. M5 v
int n_m[100][2]; h4 Z6 L8 G2 K! r( x
char re[1000][3],* l9 y. W1 |8 t* {
temp[26];
8 G, J" q" e6 }! \ k P int i=0,j=0;
2 c% J3 d5 A9 O% h& M. k. Q- {/ B scanf("%d%d",&n_m[0],&n_m[1]);
; [' o, ^* E, l0 ]% u$ q for( ;j<n_m[1];j++)
9 v( m8 q% L) R8 v8 ^" ~ scanf("%s",&re[j]);
: s1 q- j1 Q% Q7 ]+ E1 O8 w while(n_m[0]!=0&&n_m[1]!=0)
+ Q' a2 t) f& I7 e {
4 X+ }( U* ]" C9 R) d; n i++;$ c8 ?9 ^! C U% f5 f
scanf("%d%d",&n_m[0],&n_m[1]);9 P5 Z. C: _8 @/ X$ H+ s! C
for( int f=0;f<n_m[1];f++,j++)7 [3 y7 O6 n7 X, o& Q
scanf("%s",&re[j]);
, x+ n$ F, C) R! c3 x3 `4 G! x }% J* O2 S t; J2 @9 ~
i=0;- C5 d9 v$ t. K+ b0 h0 y
j=0;
0 p2 _( p0 q" E( ^9 Y' r* R for( ;n_m[0]!=0&&n_m[1]!=0;i++)4 B8 M7 A9 M8 ~7 V: O5 C
{
) X; }9 Q, z1 ~# z$ J int a=0,b=0,l=1;
5 ]) G1 Z$ [ l" [. N9 X for(a=j;a<j+n_m[1]-1;a++)$ X" E j9 j0 ^$ h b# N' O1 z
for(b=a+1;b<j+n_m[1];b++)! N6 k* W; q, y+ f
{
, L& S' ~/ {1 K) C if(re[a][0]==re[0]&&re[a][2]==re[2]&&re[a][1]!=re[1]||re[a][0]==re[2]&&re[a][2]==re[0]&&re[a][1]==re[1])
: D/ h1 U! M+ i2 E, g# I @/ B {
: @* i' e }$ p l=0;
( Q& c2 G, [3 ?7 V# l; k% H printf("Inconsistency found after %d relations.\n",n_m[1]);
' `0 n4 M7 t' n/ {2 C- v6 e+ H break;- w: z/ ?; f$ {- d8 j1 I9 y F
}# e+ n; u) E, {
}& q4 @" g% q: {( d+ ~2 E N
if(l==0)
5 N2 n+ R8 f3 O# s2 w! S8 z continue;//Inconsistency found after x relations.
3 t9 n9 @7 ?6 N: }2 c. b else{' Q$ {4 V: h+ Q4 W0 @0 ]5 P
if(n_m[1]<n_m[0]-1); s' c- Z( S9 K$ r% q. Y
{, i1 I4 X& }9 d. O
printf("Sorted sequence cannot be determined.\n");3 d* O, n% V, I1 c" c
l=0;
* ?) v5 P; B' `* J z& G }4 _( @3 a- q) C4 [3 z
else
* U% C, N4 m+ v! v, q {" \6 Y& r: @/ n/ N
if(n_m[1]==n_m[0]-1)* R0 _/ \) ^" v2 n5 @ A/ ?
{ 3 y; `! M, h# {6 E1 @3 L
int k=0,p=0;' c7 ^ |/ p! T8 T. ~* d
for( ;k<n_m[1]-1;k++)- E& t$ V; q3 k/ K) ]) @1 f* {
for(p=k+1;p<n_m[1];p++)
$ g3 k# F ?4 S if(re[0]==re[0]||re[2]==re[2]). x, e+ x, b2 T' B. N, y. n
{7 _; W2 V# H$ Q: @ _
printf("Sorted sequence cannot be determined.\n");
8 M1 E' m- z7 I6 n& F break;$ \% p$ a+ p2 y' [0 l0 @
l=0;
% R0 j4 c) R) `' G6 N' M) W }
m+ z5 t- r" _# T' W5 a8 @ }' x. U- L7 P7 T4 c
}
0 {5 `9 f3 \. p( R& `% }* ?% J if(l==0)
! U8 U# S0 F) j" |# f% T/ u- p6 ? continue;//Sorted sequence cannot be determined.; r( H! p/ y' Z+ v3 o
: y0 r+ h( O( n1 Q* W o
else! M. v P$ `2 m, k0 Q/ ]6 B
{/ }( z# b3 P9 ?6 x! F
+ r9 j* Q. t: U$ E for(int k=0;k<n_m[0];k++)
1 P7 S# o% Y k7 u temp[k]=k+65;, h. ]; _9 Y. k
for(k=0;k<n_m[1];k++,j++); B% B: k" u! c3 y
{
" a- V) u" [2 A/ v! m int t1=0,t2=0;
! N! r& }9 ^. S# i/ x for(int s=0;s<n_m[0];s++)
) y1 n' y, w1 ?) X0 V' |. O {; q8 k4 a/ z6 [/ m+ p) u
if(temp==re[0]), k- h2 T# L5 w6 C: J
t1=s;0 s, }0 Q6 b d0 e+ H
if(temp==re[2])* V; _8 w& X3 t
t2=s;
; Z5 l) O; Q0 G }; x/ D( P. H( l: {6 F
if((t1>t2)&&re[1]=='<')
, g. e# N3 `2 J {
3 a8 N8 E$ j9 p% [+ e8 {. G char t3=temp[t1];
( x5 g3 r) H9 f9 v/ U temp[t1]=temp[t2];9 _' q6 n" a3 ]. G
temp[t2]=t3;# W0 M# j' D& P- ~0 u
}/ S4 K' d6 F9 ?* A, X3 e+ A2 G K7 c
}
) n6 `4 Q C5 a# ]' m* X int count=0; Z2 [: u$ h$ `/ C
for(int s=0;s<n_m[0]-1;s++)
. W2 _$ T9 c1 O' p/ S% a! q( v for(int d=j-n_m[1];d<j;d++)
4 U4 ?. F; ]9 V5 [3 d/ @ if(re[d][0]==temp&&re[d][2]==temp[s+1])- y, i6 c1 U {6 ?# W2 Y7 k* D
{8 a; [' N+ H: [% R) Q/ i* q7 B5 ~/ c
count++;
& o1 ?* b9 J8 Z( T8 k6 |& k' _ break;- L- Z2 G) X% M( ^0 i1 e; G
}5 C6 k9 V$ f% g
if(count==n_m[0]-1)
1 m( N# y$ y% `- n' N+ I& C5 V( b( u {! |4 F n4 A9 y/ n
printf("Sorted sequence determined after %d relations:",n_m[1]);
) X' p% W0 V" E7 i: C3 y for(int f=0;f<n_m[0];f++)
4 b- I& T( g2 ^- E& [4 a printf("%c",temp[f]);
1 M6 g9 {7 t( }& t2 U2 K: F1 _+ _0 N; L printf("\n");% L' A( g6 S8 O" h9 x; D" K; D2 a
}! A& m; J# x2 |$ _
else u9 z$ j& i) d) x) A' Z" Q
printf("Sorted sequence cannot be determined.\n"); c6 V4 k, K. p# e2 B
}
. j, A' F& {/ P. A+ T }
: }' ]" s5 [8 u9 F8 W }
6 n. a2 r" n; u5 _, v6 U5 g}
; ?( P" Y3 l' u- L) ]+ {$ B. a2 a2 z7 v& _+ l5 Y
: K6 B+ q" v# |' a% \- _/ j: _" s" F3 E: r8 f0 \$ C4 N5 x$ s' F
) e% P8 b" i, i
3 C- A8 j6 E, l4 Z$ ~+ h; }: X( t: T+ r
7 |5 b, E$ ^; o" e# {2 z# {! x1 {6 T' ?- z" W5 Y
来源:编程爱好者acm题库 |