题目名称:蝈蝈式的记分 1 g3 @+ |3 Q9 {4 a `
) j' n$ [, y( [* Y+ j0 p内容描述: ! N" A+ J$ B' @/ x* L) D6 w) i
& r# c$ i- [* u7 W. L
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 6 A, T* b, Q$ w& ?
7 M4 W' f4 q$ V1 j, E5 \5 F% B
因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 # @3 K9 V9 `' g# [
2 L+ P$ S. |) ] c
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
. n0 v8 \9 K" o5 W3 A* N
, r' U% E, Z8 J* C& h/ Z! Y3 K! D3 Y5 F输入数据: - R/ M- N! a2 q
' h, x2 O4 ?4 r( O& W+ V# P以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 / `6 s7 H; u. o- v6 a
. T2 R9 V1 o4 `' j- i4 W+ L
输出数据: # t- }& }0 W$ v0 k& e
8 j: J( `! d1 x% S( A% }9 i }% p) E2 Q相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
- I5 ^- J& x0 G0 R7 T: }1 Y8 p# J0 C- [4 H* T
输入和输出结果数据样例: * b4 y% }( b3 w! ~" x: V# Q
) ]; ^0 j4 S$ }" m! ^
输入样例
: t- Z. J) z/ ^- Z1 D. d7 Z) i- q& w1 k6 ?
3 ; Q7 E O; {3 Q, B( J, u
( j) M3 g4 Y( ]- k) ?) u23 # V, _, ?- b' u, ~
4 M+ i3 u Y0 [; a
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
8 B% L1 n- K1 }5 u+ [
- W o- d6 V- B6 _25
: Z% _/ t/ L; B/ J$ k6 B: d5 x( A% `4 H
& N0 K3 T$ z6 o9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4
3 G- p& k6 p% C6 S/ K6 d; t, I/ w" y5 D3 {+ V5 O- b, J: \
43 ) G* W. H9 A. X3 X/ J* u
' e T% ^: g5 S6 b9 ?
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
: ^6 t) a7 t# h; w. j- E! R! \
: Y8 j9 p$ N# e, G* Q5 v9 y/ G
6 M F& M, }' |% q# ^. N7 |输出样例 4 W8 ~; B+ V3 A b2 r9 [
+ [: r5 }! ~2 [" ]3 ~- H
21:17
0 V9 y6 w" u2 M: _& x3 Z- s/ c! `/ R& F$ C
24:22
8 c/ T* B2 G% h( m7 y% r c4 U- T( e$ d0 t# j- c; ?
21:3
2 w: `8 t4 Z# ?& g& ^8 \
7 W. E4 q8 L, i+ A) GUnknown
$ L* E- y; M: C$ X! j8 g
' W& q) \' J$ h9 j5 F9 e21:14 4 f/ ^, ]0 r; M- J4 z$ E
# v7 N( L( |* y; G5 Z20:22
! P* }8 H# l# E+ J4 C. D+ J( \) b* K
21:23
8 d* Z9 W1 S$ \- c
& v. B6 @/ w: U; h! A8 h! M21:16 ; f+ I$ g1 j4 P+ S; x6 A% V
) H+ }& h2 {. N
21:9 2 O+ n# m1 Q! c% c1 Z5 T. v5 N
, }3 w. T" C% ?$ q
. R- k7 P/ ]) O
example: public class GouGouShiJiFen {. O4 L# j ~/ {- ?8 R$ T$ L
7 x) t( F7 M$ L" G
public int[][] bs = new int[5][2];//当前可能的比赛结果
* E+ A( W& A' o+ f4 \7 r// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果" x( g- J3 z/ R; b; W; {" v
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份" i$ ~& g, c. m' G& R7 g* H
// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
4 j* p) K8 `# {! K9 G: q public int numOfAbleJu = 0; //本行比赛可能的结果有几种" ?# v; E$ N( T% i9 |3 ]& P# u8 Z
0 K: [# q" u! N- _- n /**, {9 x, D% I% X& f
* @param index 连续得失分的index
+ ^) P$ E/ t. ?) { * @param scene 第几局比赛# X2 Y' h! Y1 X5 V" T4 Q8 L
* @param whichPlayer index处分为哪个选手得分. \# C+ b+ K( ?' T5 r
* @param record GuoGuo记的一行分
) R( R. m7 b1 S* e * @return 是否是一种可能的比赛结果* r7 W# @6 V# L
*/) d) e: _" Z# Q. }
public boolean check(int index, int scene, int whichPlayer, int[] record) {$ x& q3 c8 Q* k
int playerIndex = whichPlayer;
" ]* U# C( @* z) f( g# g3 Q boolean isWanZhengJu = false;$ y5 g. W2 Q2 U- q+ ]
for (int i = index; i < record.length; i++) {
6 v1 N+ V5 A+ y _0 e- M @ isWanZhengJu = false;3 a9 B: v/ |( |. Z- b
playerIndex = (whichPlayer + i - index) % 2;
+ U7 f& `7 S' B/ T* d1 d bs[scene][playerIndex] += record;
) C" [' }; ~. S4 } if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
) L0 P9 n% R& Y* T if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束5 J+ A" l/ {8 U7 M, B" i" Q, b9 L
scene++;
/ {2 ]3 n8 @' q! w whichPlayer = scene % 2;
4 b' e8 n" r( e3 ?8 D! G index = i + 1;1 s$ C5 y: D( Q. [& w
isWanZhengJu = true;
( b! `9 h, m. y" X! y/ q) o continue;2 ^1 j4 \% Y; ?, A I
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的! @* ~% `& `" e J( O/ E5 u: S. p
return false;* `- B6 |! a" E
}
0 h4 Z! Z- R* Q. j9 }1 N% S } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
1 k8 T3 s, [* n4 c return false;# l0 i) v" T' C. ?0 |2 {
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
4 D j5 p1 N; ?+ y2 L: v scene++;
2 s8 b3 j' m2 B, l. e: N! C ^ whichPlayer = scene % 2;( m- [9 o# ^. N% v3 H$ ^
index = i + 1;8 J7 R* U. J1 V3 R: I9 G; N
isWanZhengJu = true;
1 ?/ c, ?, b0 D continue;' j6 ~1 o/ M3 v' p2 o3 ~; q: Z
}
4 |" m( w8 X1 q; r# Y" B if (record == 10 && i != (record.length - 1)) { //下一个数分情况
6 i. |# i$ f3 M/ o; b y2 U) M int[][] bsBak = new int[5][2];
, t0 p1 V+ z& f% O1 e cpy2deepArr(bs, bsBak);
) l+ h4 R: \, W; _6 | if (check(i + 1, scene, playerIndex, record)) {
6 b0 U# o4 i0 U cpy2deepArr(bsBak, bs);" n3 Z5 {0 N' C: o- Y* k! v9 E
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误: V! _! {2 U) i$ V
return false;7 C7 z: F' Q) Q: r* y( D* w5 ?: p
}
% {: X. u" g: u6 H; g return numOfAbleJu < 2;
, @; m r+ H/ Y3 L+ r4 L/ I9 m0 Q } else {
/ {. y2 M4 A8 ^6 S) @ cpy2deepArr(bsBak, bs);
* p( I5 i8 m, ]7 R2 {0 P if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
1 t# h/ [- N% ?- z1 M% ?; w return numOfAbleJu < 2;# u- h. ?2 h- R( @! K) S; C
}- p0 g& {9 T% K0 t
}! r% U7 L7 }/ u: V
return false;& S7 X/ f" t$ Y4 ~
}$ w7 z8 Z* w' H, S, k$ \( h# z
}
: t+ g$ t% V1 Y( l , C K, y: }3 q4 }2 `
if (!isWanZhengJu) {
% y M4 X6 ]1 }4 R5 {7 \ return false;! S& l" D7 {" {1 T! u
}
; H6 r% d# A* K9 ~/ V// //检查是否符合五局三胜% r$ H$ z! q$ |5 {
// int a = 0, b = 0;9 @% A: V6 h& w% l) Z* H
// for (int i = 0; i < bs.length; i++) {9 K; r# {* R0 o$ w2 `3 l
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了3 Y5 I: A) K0 l- \3 w. Y
// break;/ P$ m% O6 b0 i: ]$ H: O
// }
& ]0 u# D7 [* [. a8 h- n// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制1 _' q' F) E p! s' J+ S' M
// return false;
. L5 E+ Y' [! I$ o" D// }. `) }0 {0 F- R1 Q
// if (bs[0] > bs[1]) {6 S( f T; _! Q& M, X0 t
// a++; z7 k: m2 i V9 c
// } else {
0 ~& d/ }- a4 X5 N, A) D* }// b++;9 X8 s6 O7 |6 D
// }
' ?4 }- u. M# I7 B& T. b- e$ L// }
, V3 [0 f% M/ X X% [// if (a < 3 && b < 3) {//没有一个人得三局,故错误
$ ]: ]2 C, H9 y; V' ^) [// return false;
! X/ P" Z, P3 @( l8 R// }" x' V' U4 r9 @0 F Y
//只要有三局及以上正常结果,则可视为OK- |6 T: U+ {1 r8 W: n
int count = 0;
/ C% j8 F- |8 Z- P4 f7 F2 T for (int i = 0; i < bs.length; i++) {
6 Q$ j5 b9 ^1 c/ W: T. {, [& j if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了) e4 P0 R2 p4 r5 q4 o
break;
* a4 k* v) d- a" M' Q( Q, g }
5 a4 E% s1 x2 y count++;
. k3 F0 K5 E: q2 b4 d; | }$ E% _5 h' q8 H' T/ `1 x6 p
if (count < 3) {
( Z: R/ f+ F2 z5 f/ ~8 e" S" t6 q return false;
" I2 r) l- @; |9 P5 }* \* j }
* e, S$ ^7 i, I* i z; I5 W2 Y . s+ R' D6 h- `1 B' Z! }, s, f5 e
numOfAbleJu += 1;+ a8 F& a3 K5 Q: L* Y
return true;6 {1 ^' K( D0 E5 y. @3 _" x
}
9 U9 D- z" | d private void cpy2deepArr(int[][] src, int[][] dest) {
( f7 t- |* N2 D! m, J for (int i = 0; i < src.length; i++) {5 t9 J1 _% b# a2 s0 j
for (int j = 0; j < src.length; j++) {
9 S- E! C9 X2 w1 Z' U dest[j] = src[j];& V% Y( B; I" R) N& q( Z
}0 J3 u7 O8 Q5 X, H% S6 e) l
}4 R* F$ [% l9 G9 g" @; F H* F
}3 B! C3 A/ \, T3 ]2 C
6 s( c, z, c4 q x: e
public void printNowCheck() {; E, h0 h. a% h
for (int i = 0; i < bs.length; i++) {
1 C/ q: C8 r) E5 h- U if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了6 L+ e1 G( m% l- E
break;3 ^* d T- v2 h8 \
}8 d% A M! M+ y9 P
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出 w; e" R: O& Z' Q% x, a0 F
if (bs[0] > bs[1]) {& L& J( ^5 ^: O0 j0 D# Q* |
System.out.println(bs[0] + ":" + bs[1]);8 x: H0 F# N" d! X" f* K. l
} else {' B3 p1 h* H7 y; A4 v
System.out.println(bs[1] + ":" + bs[0]);
' r/ v7 E& ]1 K3 P6 q& u+ a }
4 O2 Q, w0 S& ?, [( |$ ]6 p }, h: @1 u3 b' i3 m1 J
}' u6 X9 ]4 N. h, a, o: z
public void resetCheck() {9 ^3 X! i3 J5 c5 q
for (int i = 0; i < bs.length; i++) {
; s8 C' C$ l* @, { bs[0] = 0;
* D3 T( S& p$ `4 j, n( {2 h bs[1] = 0;0 `* I V X4 T. n" I
}
1 a. ]! U9 y: z }* [+ P5 x5 g. U2 J
/**5 ]* B: `$ q) Y- \; N0 l8 H# _
* @param args
( ^9 Q4 t* a) B; M- c */
9 R4 j) Z' m; _ S R- [$ F3 j9 @ public static void main(String[] args) {8 C Q5 Z2 x1 _8 `
// TODO Auto-generated method stub
9 j+ _( Q" j/ M/ ^2 [5 S* C9 u. Y GouGouShiJiFen obj = new GouGouShiJiFen();
" F0 B2 z; N F. X! j7 K0 A int[][] testData = {
; ]$ X; P" G9 t5 i5 P; M) J {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
: K" U& e1 f4 V& j V4 O {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},
. V& G+ @# A6 u, x$ z! F8 }: @ {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}. X) q+ q# G0 U2 }8 s4 T
};7 e* f$ A4 J3 J# u$ v3 g
for (int i = 0; i < testData.length; i++) {6 C( V* o& y V+ u @
if (obj.check(0, 0, 0, testData)) {
B1 S$ I3 i$ W2 Z4 H% z obj.printNowCheck();2 v$ H1 J7 e$ ]6 Q1 [
} else {
8 J+ a* n, C) t+ g7 |4 P$ X' W2 g System.out.println("Unknown");
8 p, t9 L$ F3 _* K/ `7 N9 R" B }/ P3 R: J( m5 q
obj.resetCheck();/ u' r& v0 |( _3 T% q5 }
}
$ X# P1 S* k- e& S& Q% B0 r8 [ }
; s5 ~7 w5 l; ?3 W; T4 b$ t. y3 C; M' x7 {/ @
} |