本帖最后由 厚积薄发 于 2010-5-6 18:40 编辑 0 J; B$ U' K6 ~, [* R7 D
8 f o# R& c; c9 CSorting It All OutDescription$ {) v* A# Z: k l- e
% U+ \; V! a5 L {An 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.
$ c0 a u5 \ L nInput+ |. J' r% [6 @( c# C$ X
8 U% F3 z$ m" e! ZInput 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.
! c2 Q% X. D: X% g% o' h. xOutput* d$ S) Q8 e F4 S- q3 ]4 X( M1 @( a# ]
# z0 I6 t( Q% }% r6 U1 p' CFor each problem instance, output consists of one line. This line should be one of the following three:
% n$ T; X* e3 ]1 c0 F2 b5 i9 I i$ a; D4 }, v4 d( p1 z. Y% L7 z
Sorted sequence determined after ** relations: yyy...y. 1 N: L! Q8 c9 p' J
Sorted sequence cannot be determined. + r0 l$ J2 J0 c( \
Inconsistency found after ** relations. 6 K1 {1 R2 `1 j7 T" ^4 k
. }/ S9 j! r: Q5 F! b# q# C
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. $ Q" {; ~5 P! @: t) I# j) d
$ P9 W. m, \$ P3 E6 C
输入样例
$ N7 `$ g+ Z3 v" G$ n4 6
( ?, g6 ]) m5 XA<B; Z' u! n0 z5 w1 G& }" J
A<C
! b2 V. Z5 @0 b9 U/ xB<C! n+ c5 h3 q# {% ]) N, m
C<D0 y; m# D9 p! O0 G2 V
B<D
1 o) o9 o" `. K. y% X3 DA<B
^( i6 d0 w4 ]( v5 ^3 2
3 p' w1 c& b* o" L6 aA<B
$ X' ]5 g) }7 V# H! }; w+ ^9 TB<A
& W0 ?4 x: \; j0 Q& l' g$ T26 1' ^* |) j8 u3 Q" F' J# H, p: w( p* k
A<Z
4 p& @% \' s0 e3 U0 R0 0
6 u. S' ~2 {: s9 j$ V5 B+ ]& O
4 G4 M2 g( i. [+ l+ K+ ]1 G" @/ w# i输出样例 ) V7 d# G' p0 r) L c
Sorted sequence determined after 4 relations: ABCD.
2 `4 i3 M' G+ u/ jInconsistency found after 2 relations.8 `- Z4 s# r/ B: w1 P
Sorted sequence cannot be determined. 6 S4 f) D m7 F& `3 [
Source: m' B" ~; Q. B& d9 ]) U+ K7 _
: R) b& @ W4 L9 R$ D& OEast Central North America 2001 ) I' P6 V* F8 P l
程序解题1: / N: q# c9 V/ [8 N% X# v
//By Jackie Cheung
: T. M# l4 A% c3 Y#include <iostream>- U0 E8 Q: n- ^9 N5 ?: U# r
#include <string>
$ ?1 x- N; {- R- a#include <cassert>) V9 o, y' D0 b/ O* I" M
typedef struct tagNODE : ?( _+ s. ~ ~2 R
{
( P0 W& L: r! r char val;
/ e3 |6 A/ Y: B; R struct tagNODE* link; e3 d2 ^3 t$ ?: Y
}NODE;# v& K" E0 U" d- m" k
using namespace std;
/ L1 \) K2 W& D: x6 w& J6 ^void Marshall(bool** arrary,int n), P f$ Q0 J. p/ T
{
% I# Z2 ^0 c7 N& b/ H/ F for(int i=0;i<n;i++)
# L; u& ?# M/ j) { {( l" r- C( B% ]
for (int j=0;j<n;j++)' k# f6 x2 }" N
{
( c* h8 p) f d' t2 q" z: h& }$ M if(true==arrary[j])
+ V& H4 W' C* r6 z' a for (int k=0;k<n;k++)
% x9 Y0 b- S( {- _) o {' j+ g* ~! }( G1 R; A( i2 B$ s
arrary[j][k]=arrary[j][k] || arrary[k];3 u. l2 V3 v$ R
}- j6 z- X0 t$ `
}* Z1 H2 N& b# R1 M' S3 p5 L
}* F6 F, ]" r, {; N
};' q7 M" B8 L' ]4 d! x
bool SearchForRoute(bool** array,char Seq[],int nLeft,int nIndex,const int n)( E j! E8 R5 g- ~+ p! ?
{+ S+ v& K1 d3 @" V2 B
Seq[n-nLeft]=static_cast<char>('a'+nIndex);2 z* M9 T6 y. Z+ a
bool bFlag=false;6 H( g+ p1 {' y+ ]
if(1==nLeft)
) ?& H1 s! N& r7 ` {
& U! H- K3 N- p2 M5 J4 Q# l/ ^ Seq[n]='\0';
- a3 H! N+ G2 u( Q return true;3 F# ?: U2 g: S$ G5 L
}, m. J# `$ }# o( f7 d/ I& Y9 F
for (int i=0;i<n;i++)
4 ?7 o& i% ?( ~! F! ? {$ h/ _3 A6 g$ m! Q
if(true==array[nIndex]): n7 l% v# v: Q( f k9 p! I
{
6 g, l/ E% W* e1 a
4 f8 u Z E) \# r7 k/ ?4 W bFlag=SearchForRoute(array,Seq,nLeft-1,i,n);' Q* E5 T+ ?% X9 Z' h0 C- ]
}) t% R" J' C, e f) |; _
if(true==bFlag)5 K) f1 ^( w0 _! v( y& T
return true;
& l; P; |. I( ~+ T( h }
T3 T- u- m, J& i3 I& q) H9 M return false;& [3 g. \ k8 I
};
1 \/ C/ M; n, Nint main()
! }% m0 t$ y7 v! @+ v! w/ Q( j{
) U6 W5 F0 b8 C$ ] int nSeqLen;' ^ o' T( t6 e8 ^3 ~
int nRelNum;
8 W3 n. V( N4 j; y cout<<"Input the length of the sequence:"<<endl;
- G* Y7 f0 @8 y1 e, M9 x4 D1 \ cin>>nSeqLen;
/ T7 d* y, L+ q; a8 Y cout<<"Input the number of relations between the elements:"<<endl;
' Z2 `, L, `3 j$ Q" c cin>>nRelNum;
; j) u( ]8 I: E/ {9 m+ l0 Q5 J //1:if nRelNum<nSeqLen-1,then the relation can not be determined!5 d% J. F* q9 {$ N
if(nRelNum<nSeqLen-1)$ ]4 [ `) `) X i
{
4 ^$ k/ Z0 [- M K0 h5 A; k cout<<"The relation can not be determined!"<<endl;
& ^2 w% q7 z/ N- w: I, r" W* h% o return 0;5 @$ g0 j8 {- [* O
}
5 n1 W7 S( s, m! ^ string* strRelations=new string[nRelNum];
5 k$ b% t! B- _& Z% ?3 s6 t$ |9 b6 W char* Seq=new char[nSeqLen+1];
6 y" j+ w$ J; X, t7 Y# S, Q9 j bool** array=new bool*[nSeqLen];
8 s/ M! p! C; T6 Q# @6 X7 h
$ ~% ~# x4 Y; i$ Q9 t$ J0 r4 W for(int i=0;i<nRelNum;i++)3 o- i; p, j9 _; h0 @
{' ?' {' I, T2 P8 ^& v
cout<<"Input the "<<i+1<<"th relation:"<<endl;
+ }4 M6 b6 C1 Q! r% z' i' f cin>>strRelations;& O# u' h H/ k/ l) h& \1 \
}; i: h* X$ y( E& v4 {8 e
0 e: p+ y/ m/ J1 |
for (int i=0;i<nSeqLen;i++)4 ~" s" x, D/ O- l2 d' z7 k* ?! {
{
. v/ S& Y/ v9 }0 ` array=new bool[nSeqLen];
, G" z% `% O, d" Y; S) V for (int j=0;j<nSeqLen;j++)
+ X c' D5 |" z- X8 j3 e8 T array[j]=false;
- H H3 |$ S& }& w }
8 `4 \) C+ C% K9 I" \% Y- ^1 ` //The main loop: k" ]0 H+ L* V. H9 B
for (int i=0;i<nRelNum;i++)/ Z; G7 t+ t1 e9 ~
{* J4 O3 N) w9 T: j% Q0 R( S% ]( X1 f
char a=strRelations[0];
4 \1 @ E/ }; Z% K char b=strRelations[2];9 E" b5 H) e Q3 v
assert(a>='a' && a<'a'+nSeqLen && b>='a' && b<'a'+nSeqLen);& ?9 H: u U) Y8 r3 h
array[a-'a'][b-'a']=true;; t8 ?$ h0 i+ O, x
9 |7 C' v+ a2 O' q2 O" B Marshall(array,nSeqLen);8 J5 Z2 r9 K+ _, _9 q i7 S
& B' e" c, a; ]5 Q //Check for Inconsistency after every relation
$ R, N) v( w5 d& j for (int m=0;m<nSeqLen;m++)/ P! i, L6 x; O" X( J" |
{
4 N$ d+ c# f& p$ K! a% W+ h! f3 u if(true==array[m][m])
; d( v0 o" [2 P2 A {" P" v0 p" c% U+ V
cout<<"Inconsistency found after"<<i+1<<"th relation!"<<endl;- t& f4 S* Q# I- Z7 o9 K% I
delete []strRelations;+ L) |1 `: p8 N: O: I; R
for(int k=0;k<nSeqLen;k++)4 Z2 [- k( g0 s; D
delete []array[k];5 W: v/ F, j. N0 S$ G& ]1 V
delete []array;
# @3 G) h6 P- o: S% e- N7 G: e; B delete []Seq;" ?$ |' j7 H1 m5 K. l' G$ V
return 0;
2 R+ F1 x! K7 O. _. ^" F
( K' w# l+ G k: P } }
- K# W3 ]/ h3 M7 O6 j }
$ ?% B7 P/ B B1 z7 q7 w2 q& r! D
//Check for the determined sequence after every relation ; {- a ]! W: g0 Z* {1 n
for (int j=0;j<nSeqLen;j++)
; d% a5 a7 e+ }$ W- n5 R {
2 o, C% a- T' _8 N% ~0 Y: v: _ if(true==SearchForRoute(array,Seq,nSeqLen,j,nSeqLen))+ @( K6 L! ^+ x N6 S" y
{
( U3 U/ a7 r0 ?6 O cout<<"Sorted sequence determined after the"<<i+1<< "th relations:"<<Seq<<endl;* _. C, ~4 [! H
delete []strRelations;
6 Y& f% r8 y. [ for(int m=0;m<nSeqLen;m++)
" W* D# `/ e/ b0 e: s4 n' P delete []array[m];
$ s, Q. x5 }7 o/ E* O0 ]1 Z7 } delete []array;
" n b, P6 p& n; w* x delete []Seq;
: [8 J4 M7 u4 d7 [& w9 l5 W return 0;, u9 L: d. E3 l0 c" L- ^3 I0 O( o
} L: a7 G' Y% I! v- y" a
}
7 G: j( D/ r4 I
& k) c$ o% d; N T
, P) D+ U0 K6 B. {: E/ F }
0 A( g5 X9 `# Q" ~1 C; T //If the program has come to here ,then the relationship hasn't been determined!!!, I' y. _( ]3 a: a+ ^+ c' b8 S
cout<<"The relation can not be determined!"<<endl;
! m. M! r9 e4 h/ |8 v1 q `0 _5 ` delete []strRelations;
5 H1 r' |' t# o b* d for(int m=0;m<nSeqLen;m++)% U5 I8 p9 Y$ ~8 \3 ~6 [0 v
delete []array[m];$ ~, e" }, j( r( v6 U! K+ h" B
delete []array;2 L- A; o& ?; O1 ~7 `
delete []Seq;$ U& b. N2 a/ f1 h" y8 j1 G
* K* M- N6 D0 y2 u4 p, @
return 0;
; F2 \$ e* Y7 B+ |% t}! c# o1 O$ f7 j! l1 Q
! w; s c4 Y2 Y, h程序解题二:#include"stdio.h"
% [# M x2 v E: fvoid main()% {2 g# @3 |$ J0 i
{! B* _" N! V2 ~
int n_m[100][2];' ?- S P% z) Y" X1 D* G R
char re[1000][3],1 a* Z% L1 O5 M- ?9 `
temp[26];
9 D$ x; z5 i: s/ V int i=0,j=0;5 |/ [7 U8 @: _9 Y5 C
scanf("%d%d",&n_m[0],&n_m[1]);
+ V, V- v$ B1 t: ]9 w for( ;j<n_m[1];j++)
7 w8 j# o/ a& z" Q. M scanf("%s",&re[j]);
- c. t0 D, I8 f" e+ z. q while(n_m[0]!=0&&n_m[1]!=0)
. |3 G( M! F& W5 Y( |( f! ? {* ^5 }/ ^( S' n- B* }
i++;
3 U! G- r+ t) F& _$ C* H scanf("%d%d",&n_m[0],&n_m[1]);
( [, `8 r. N# d* o. u+ R8 j for( int f=0;f<n_m[1];f++,j++)5 W( H6 b5 n1 B! [
scanf("%s",&re[j]);: P0 Z4 E) B; @6 R2 N {# x% Y
}/ \8 P" Z/ m+ U& a
i=0;
! j8 f7 [8 I# ~0 v" ` j=0;% s2 A! T8 d) t( e9 ?8 v
for( ;n_m[0]!=0&&n_m[1]!=0;i++)
2 a0 y ~. n5 C4 b2 y c B5 s. d {
: n/ j. [0 A: v8 [ int a=0,b=0,l=1;+ |1 X' ~- X f. g) K- C) B; B9 H
for(a=j;a<j+n_m[1]-1;a++): I( l. T$ O4 Y' i9 k' @
for(b=a+1;b<j+n_m[1];b++)% @( x1 R; k3 B- \) T
{& F! a, u% I: H- _
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])
) f) ~( k# n+ y) V {
V& K F9 B' s0 m/ p7 L l=0;- y: n, r% a& k
printf("Inconsistency found after %d relations.\n",n_m[1]);$ P& n# d! L" z5 G1 j8 h
break;
! v$ q0 j% C& @; o3 A% d3 H5 [ }: Q @' `$ O# K! B
}* W; \1 H) d, n. _8 E
if(l==0) 9 ^& L" D6 k r, h, d N
continue;//Inconsistency found after x relations.& h8 H0 p: Y1 O2 g r4 N
else{" w0 i1 F v% y- j( m; Z7 f
if(n_m[1]<n_m[0]-1): y4 p4 D' t* g8 v" h/ B
{: Z8 v C( F, @. j" S
printf("Sorted sequence cannot be determined.\n");5 u+ Y3 D( W$ d
l=0;7 S+ ?' g, W- h( W9 X3 Z6 o
}$ K' M2 N1 t$ H, F9 L. w
else
* O0 c) t# I" \; o. w1 v0 H {" S' B7 U4 A. o; A
if(n_m[1]==n_m[0]-1)0 C, W2 P. d% K
{ 0 c/ f7 d7 F( H& U P z
int k=0,p=0;
* @3 x2 I* ?) n for( ;k<n_m[1]-1;k++)
3 v; @9 O4 x/ f8 a" n for(p=k+1;p<n_m[1];p++)
% }3 A6 p6 }4 P! K S/ X if(re[0]==re[0]||re[2]==re[2])
* ?7 a. z I& K {
* T, p' T. z- u( L$ A printf("Sorted sequence cannot be determined.\n");% O% y' L: F$ P% E8 i' G- V
break;( z) n2 L% N- {9 w0 V1 M3 Q# o
l=0;
$ B3 o4 p* D# i% M+ }" ^4 o, l$ z }
% L* ?2 g+ ?1 ]# h/ C }
v% G4 d$ _& c1 f2 @* B* d# J }/ D3 P+ J. P4 Y0 o2 F1 J4 Q4 Z6 V
if(l==0)
4 V+ S/ m C* }9 D4 m0 f continue;//Sorted sequence cannot be determined.. w! r. Q# {3 `: O9 E/ K5 G
3 N* `4 w! N7 f; \ s1 G$ o4 V4 ^
else5 x$ Z+ q6 O( _; k
{
5 p* a* h# x3 M, R$ l- M 2 ~1 R$ K( B" J0 Q" I
for(int k=0;k<n_m[0];k++); a6 O4 t# f7 U
temp[k]=k+65;
0 [% Q$ ]. N! ` for(k=0;k<n_m[1];k++,j++)
; G/ L6 [! [- j( \, y {
8 N! S9 D; J( y; ] int t1=0,t2=0;( x5 W, n' n9 L; s+ C" H
for(int s=0;s<n_m[0];s++)
7 F! B2 h- r2 q+ k( Q6 R {& ?0 y/ Z) v! P8 o- Q
if(temp==re[0])
! N: |3 H& w f, w) \0 r$ Q( g4 `/ n t1=s;1 Z$ d- W1 }9 R. s
if(temp==re[2])$ m- W9 Q$ ?" D' j& C i& X! w
t2=s;
4 Q" I; {) g) }/ V }
0 T( f9 T8 K' e7 w. U2 T! i if((t1>t2)&&re[1]=='<')
; J- X9 B Q8 z: t2 C {; G2 Y) x. A j1 K9 w! I
char t3=temp[t1];, f+ V) K2 K9 V
temp[t1]=temp[t2];
5 r0 Z3 }7 i/ T temp[t2]=t3;
1 l5 }; W3 p7 F! n; C# ? }1 I0 P% e7 N/ {) a- g
}# b2 w0 U! T( O$ h( o/ C9 M
int count=0;& J1 o- `" F0 z
for(int s=0;s<n_m[0]-1;s++)7 A! p. D) u9 f& {: {
for(int d=j-n_m[1];d<j;d++)
J* [0 T! b$ x" C, x, e if(re[d][0]==temp&&re[d][2]==temp[s+1])
+ s8 F6 {3 W% D3 U7 L) l- b {% Y. W* n* @$ E, B% U
count++;( }; }/ ?- ^/ ~8 \3 x
break;6 N! R! R+ V$ P- \: b
}; R9 i* q" F. {9 Z2 T( T* s: a. P
if(count==n_m[0]-1)
- F* R! V- E E/ r2 L: r {
& N' N5 g4 v8 F' z1 F+ A0 T6 e9 S printf("Sorted sequence determined after %d relations:",n_m[1]);
; M2 [; c# u! z# n8 C$ d& B; ` for(int f=0;f<n_m[0];f++)
" ^9 J: Y9 |- T4 F- O printf("%c",temp[f]);
( o# ^. W: [5 e& y+ L% r- g3 t printf("\n");
/ R& T, i& v: g) r q/ o }
: |! e4 h. g } else3 C! {8 g- i' j
printf("Sorted sequence cannot be determined.\n");
: B9 @! U3 }9 ]1 K }" m, y) j# I- T0 Y! P
}
" i! X" `0 z6 P5 d5 A- ` }/ z* d$ l3 \" o% e
}
5 o/ |5 Q) d3 K% M } E) u8 Q0 s7 [8 V: x' b% b2 g9 m* ~
& D& r3 J& ^/ l: @/ A$ n* m
9 a3 Y! v+ W) `( [
: w1 \2 q7 O0 u6 h5 o% p. t, v! U; h6 e) [
3 _ i, @+ Y& u( ]3 p
6 E1 G% R" j; G' O. r+ x; i
4 w q) l0 T& y% e来源:编程爱好者acm题库 |