题目名称:蝈蝈式的记分 0 v* p( L; i) r. w) Q! @7 {& U
) x8 |$ M6 _% O7 s) K* M内容描述:
7 v. k4 g7 S( y
Q) w% q. n* W蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 ; e# c* t) Z: J: L3 d/ \
( \; c- b% d. j, h因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
4 R0 `; A# U0 C! U+ ]
. L; ?2 S3 i3 z5 b; F) b需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
5 `3 y r+ i3 h( r* Q2 ]
, }3 `* v; L* E- o9 D6 _3 X输入数据:
! A P9 q2 E, L$ d( J0 b$ C5 l3 l4 |5 {- o, }
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 3 j# c8 U+ v P3 d* g( v: C
3 ^7 J6 L* t# [% W. B9 k* D8 n6 K
输出数据:
6 j7 ?9 H0 ~( w# E; O7 ?, W( I5 Z- e. W) P# E- y- F7 y
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 ; h: H4 p% {7 k2 ]6 @) o
: f& V2 y! J* q- f+ C
输入和输出结果数据样例: 6 Z' U. _% i( E* I) Q
8 j: D4 n" L& t9 s0 u0 L, @* I
输入样例 4 X$ |& w( d; B4 W' P1 Y
8 Y( d, v( s; H; s3 ?3
: @8 ]* p/ Q: h1 M$ V6 z
' v: d& @, S) V7 M& k. \23 & f; ~, \# a. I {
m! R3 h" K6 Q" T7 v* J9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 # f( K# C! `3 F
6 ]# F( Q- L' b, |' S) `25 & U/ @0 _) [' L& _
" i8 g: U- A' f7 E
9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4 , N% C4 j) Q0 ^
9 V8 s) r5 p1 l& K8 x+ W43
6 E# D( g2 R% G3 N- {9 _' Z8 h" k# n( J9 u, m2 j2 J% |
7 7 7 7 7 3 4 5 6 7 6 5 4 2 1 3 5 7 9 7 5 3 1 3 0 9 9 3 9 3 2 1 1 1 5 1 5 1 5 1 5 5 1 ; d. A% w1 v9 J
; j/ X& A( o, n4 }, B% g- w7 e- k$ {, W+ k8 Y
输出样例
, o' n0 a9 }; W; Q0 M0 X9 j8 T, h! b2 b" A/ w' z
21:17
( U1 \: q j- _; M& o: G- z+ W6 e, K: c3 p
24:22 + u$ D3 i& }4 O3 r" B
6 b/ O% G: O. P j21:3
" v" Z+ l9 h$ p, Q+ S6 D. K
' I: u" {& v0 ?1 }6 s/ EUnknown
( h4 [+ p: x$ g9 g
& Y$ B# N1 F+ t: p+ r( q* T21:14
# U- U: {: s4 T; V( v7 j+ Y; \4 S {3 {% O9 Y) p4 R# x1 m; a/ m
20:22 \) U2 R! `$ ]3 k* U
0 n) w$ N1 `& F% o) F& Y" T
21:23
9 Q: m6 ]0 ^$ U$ Y! ^+ A2 E$ z# t
21:16 5 s& I2 A$ S2 x6 j- K p
* z2 S T$ g' ~$ z: W7 e8 r" V$ }
21:9 $ g, Q" w `/ h6 d
* Y1 c' L1 b0 y0 G1 o2 V+ j3 w
/ y: `5 f" G- Q, u
example: public class GouGouShiJiFen { a _! g& `, M& N! T
3 U/ q j! G; U6 g+ f* W public int[][] bs = new int[5][2];//当前可能的比赛结果
2 v) D4 D& G6 o4 u// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
! r7 D) {- A( Z// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份% ]" ]4 ^( a. l6 L
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown; P; ]7 g$ B% R4 l: G% h6 `8 k
public int numOfAbleJu = 0; //本行比赛可能的结果有几种3 F) b. Z+ c- U% m
0 B$ L/ D8 H- o i1 ]7 h
/**' |4 O k C9 T1 K
* @param index 连续得失分的index5 o/ W0 o! J3 D: ^4 Y
* @param scene 第几局比赛
. G# Y/ }, k' a * @param whichPlayer index处分为哪个选手得分- O" {) Z- ?) U
* @param record GuoGuo记的一行分! p2 t9 G' b$ w! m+ d1 D
* @return 是否是一种可能的比赛结果
' g* i2 R# K. f. d4 U* q3 D: }4 a */
& k k0 g; A5 ] public boolean check(int index, int scene, int whichPlayer, int[] record) {
, ^0 t- S% o ?+ o: J0 p5 g7 ?+ C int playerIndex = whichPlayer;
. z) l! T9 Q8 J/ j+ u2 x boolean isWanZhengJu = false;( H1 O% Z8 C, F
for (int i = index; i < record.length; i++) {9 [6 @7 K( s+ c$ s9 Y
isWanZhengJu = false; O5 q$ q# i+ @
playerIndex = (whichPlayer + i - index) % 2;5 ~1 i/ U8 {: Z# p5 ] A5 G
bs[scene][playerIndex] += record;/ _, `4 y+ E: x5 c1 x6 O; N" P
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局: m3 K K4 a" ~/ V$ l- r
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束% Y1 `" q+ F# t& V- ?
scene++;& \) W$ U% |3 a: F
whichPlayer = scene % 2;
) U( {1 I0 ?3 k* b) h# H! i3 [ index = i + 1;: l c" ~5 x+ G' V% c8 I8 c: `- I
isWanZhengJu = true;1 ^' T' J* ?* w5 E
continue;/ }$ [4 x) Q7 Z" p. t
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
e, I/ n. z6 E0 [, g; e" \ return false;
8 A f$ T8 q9 b& r0 y/ C }8 X( p/ k1 G6 Q, r2 z3 Q1 r7 k* h# Q9 c
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
5 E; F) V5 {& [; j d3 A return false;2 [) U( B0 o0 }& F
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束0 n" ]# j9 R: @! }* {* H( k
scene++;
7 }# m6 r* D# ? whichPlayer = scene % 2;
) t9 l* \9 P6 j5 k6 c% j5 Y% |; u5 ?$ J index = i + 1;
' b# ]/ f0 _5 } isWanZhengJu = true;
% a( |1 F/ q9 _; t continue;. Q8 q3 k0 p: n6 Y
}4 \$ \+ i. M4 m0 g/ r! r( @
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
7 h2 ^( |4 W1 @# l int[][] bsBak = new int[5][2];
6 Q& \8 y. f( ~- @' h; S cpy2deepArr(bs, bsBak);9 i& C( X1 G& E, o: w1 R
if (check(i + 1, scene, playerIndex, record)) {
. j! W/ F7 f+ g* w ?) { cpy2deepArr(bsBak, bs);
# \; i$ o: G+ I8 ` f if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
& c0 A8 U2 |. S0 i4 Q7 A k8 R/ c return false;
( {' ]8 X' p9 s4 k5 k& w! n }& n% G7 ]2 N6 q3 f! m# k% k) ~$ e
return numOfAbleJu < 2;0 e, S& A8 } M: P2 K) n; g
} else {" \' u3 N& u* M
cpy2deepArr(bsBak, bs);9 ~6 s; ~5 J3 o' a1 Y
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
9 I7 b8 W- x$ a; H' e' O1 F2 J return numOfAbleJu < 2;( n+ G( Q& x3 X( t" P. X
}
1 O$ L1 g3 B" G0 v }
9 N# g: e9 E* z% g- t3 \- ]6 J return false;7 i" q: @) k2 i/ k7 \. X
}' v; V1 |/ P @; Q
}) Q# Q! ^& M8 p3 m+ Z- {
/ b- [/ i5 ]$ ?1 }5 A' {
if (!isWanZhengJu) {: Q6 o% h e$ v5 ]
return false;; D0 A% x/ w$ D6 l5 p P7 C
}6 \& N. e- k8 w0 p1 a! Y' X
// //检查是否符合五局三胜
_( [1 m l- N6 l# a// int a = 0, b = 0;8 u% J& T9 h* W. V
// for (int i = 0; i < bs.length; i++) {2 G( A3 i7 _: o' V' f
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
6 M- m& i, G. m b$ d1 R6 z// break;- @% j8 m3 }( W- S. C( k
// }
% I6 g4 j! ]0 I5 P, D1 @& Z3 A// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制% _1 I/ i$ @( r' q+ e7 O9 c
// return false;1 ?; J& I$ e( ]( a* q# B2 o4 r' e
// }% Y0 Q$ _0 L2 u2 H
// if (bs[0] > bs[1]) {' C" k3 o1 \8 ~' L; ]5 p
// a++;
: C4 E8 j! ?- h: _$ L* u9 M* m9 f// } else {
# o' `+ o+ Q i9 f// b++;. [; R( t+ H( a5 [' a
// }
8 ?: ?$ e( F# g7 ]" _// }- s1 a. m7 w: g! k
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
7 _, @& h, s! L6 S// return false;
* \; i9 A5 p) w// }# X+ E2 Q3 o% a
//只要有三局及以上正常结果,则可视为OK! h& ~* V2 \+ t F2 v
int count = 0;
4 e0 \3 Y* S F/ D2 p for (int i = 0; i < bs.length; i++) {
# b& C! Q% B6 ? if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了5 H2 Y) S e$ G# t' i% O# y
break;
" `, C- `3 B8 Y. O; o. u7 u }
! b4 i1 m; I3 s6 V6 v" g5 H0 B count++;
6 |2 F' J( v- M j2 E" [ }
& p# H+ I$ ?: |7 \7 d' M) S if (count < 3) {6 D! e ]) j$ P" `! u
return false;' C9 _4 q7 W$ b3 I0 L2 L, I8 Y4 r
}
% f% T+ E7 ?0 M/ B% O7 r A0 C/ `) P
6 E% @/ k' q+ i3 D& z& \! u! s! J numOfAbleJu += 1;/ f! U- ]8 V1 E* N) o0 d
return true;
* d3 Y# U$ k$ }! `0 B0 C6 L$ w3 w }) S) ~! @- a! [) l
private void cpy2deepArr(int[][] src, int[][] dest) {. q4 g6 _6 c8 U: i" n* ]
for (int i = 0; i < src.length; i++) {
( ? U& h& ?* k3 C' ?; } for (int j = 0; j < src.length; j++) {
- X4 Q4 U1 a4 g- g dest[j] = src[j];
7 d( \# t. p7 j' Q: y }: [1 e5 a1 I: N0 X- I7 L
}
6 U' }$ Z2 X1 l) d$ ] }
* n- h- B) Q: c2 a2 H( V0 s! G
7 i6 c$ z) b1 r. C: z1 ?3 x" o public void printNowCheck() {" v: F; W/ d2 i. x ?% E4 R0 Y- D
for (int i = 0; i < bs.length; i++) {& ~. o9 y0 V& [5 M) o/ U: S0 U
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
9 \/ }! D, ?$ t4 D; I break;
+ j( `( T; l5 _8 e }) p/ ^' q3 B( j4 R H0 a7 p
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
2 ^0 H+ o9 M( A# O3 e if (bs[0] > bs[1]) {
2 n/ t1 W: D7 a& \" g1 o2 [! [ System.out.println(bs[0] + ":" + bs[1]);
: I w: v0 F% E! F! g4 A } else {3 p6 o Q* I- z% M: I1 o% l9 o: P1 d+ [
System.out.println(bs[1] + ":" + bs[0]);
! ] E9 \% X9 `. N- { }8 a5 y2 M4 P5 Q6 F
}
. g2 ]) H/ u6 V3 l- I! A }
6 R1 l& v9 ?4 j* I3 N1 x0 x/ T public void resetCheck() {
$ g; J# d; P0 _% K# ~/ d. _: R for (int i = 0; i < bs.length; i++) {! @& I( |# W3 E# B6 M
bs[0] = 0;3 @# X3 a3 Q) I' J9 r
bs[1] = 0;0 p- S& L' j# z0 ]7 z
}
2 r, w* f% E* O1 _. H( q }7 @4 Z+ Z) a2 ]" r' U6 f
/**2 r3 ~+ v1 y$ I, S) Z% `: T" W) x+ ^
* @param args W) V$ J- o4 ^: m
*/; Q/ }3 J2 F" x9 i( D! x
public static void main(String[] args) {
" U0 \. |" I/ L- W% J // TODO Auto-generated method stub
+ s) Q. J) A1 D. d; }8 s2 ]" f: i" a U! S GouGouShiJiFen obj = new GouGouShiJiFen();
) e& } f6 d( G2 U* e3 q/ m# C+ _! Q int[][] testData = {
9 F- h$ K0 z( c: n" b: T {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},9 f) ^& c/ M& p
{9, 3, 8, 5, 4, 8, 3, 9, 8, 4, 10, 10, 10, 10, 2, 10, 10, 10, 10, 2, 8, 4, 9, 2, 4},
9 s+ q+ _$ g3 E! o/ k0 C% S {7, 7, 7, 7, 7, 3, 4, 5, 6, 7, 6, 5, 4, 2, 1, 3, 5, 7, 9, 7, 5, 3, 1, 3, 0, 9, 9, 3, 9, 3, 2, 1, 1, 1, 5, 1, 5, 1, 5, 1, 5, 5, 1}* {$ I7 T j* C6 X
};
8 S u2 ]! S* b( V for (int i = 0; i < testData.length; i++) {# j! l- |" ^) o- u
if (obj.check(0, 0, 0, testData)) {# o) g7 G9 t9 W, F4 k' `; i
obj.printNowCheck();
2 I- Z. t# O( h0 ?( h } else {
: Z0 y: o- ~: y# |5 C System.out.println("Unknown");" D, [/ ?, U4 ]9 V1 U4 R
}
( G6 O- E1 N8 g n" c* _ obj.resetCheck();
3 ?. ?0 A/ P2 _8 v }! q% F4 e3 w1 a3 t/ z
}3 l7 j$ i. j# o. u2 i6 I, ]( g
O9 |9 f4 d& b+ C, F} |