题目名称:蝈蝈式的记分
+ W3 I; M7 L5 \2 t# P9 W- _
$ @$ \2 _' h1 f! W9 H1 z* r) [内容描述:
" T, w1 z% l; D/ ?
: @$ G/ P. H' c* S蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 , D# _: T" R. {( X/ S2 z$ b7 a! k( s
5 l6 k$ N) @- ~4 d" F5 I6 h5 {) H因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 ; Y5 y/ Z( Y3 ?, H# _$ J, S. s
+ L: |% |4 @6 z! E8 S0 X8 x
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
, q# |, M- V5 w* y
d* a2 b, T/ `( I1 I5 A& ^输入数据: m( e8 \( ?4 x) X$ N" q( e2 s
# n' d! H6 j$ @5 o y( o
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
& Z! S2 f& C2 G, h' G+ e- \" u, K! w, n' x, p
输出数据: / X7 l1 r" i6 q6 o; t
" |; U/ F3 ^7 ]0 o% q# t5 ^相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
' U9 X7 I. i: N/ ]- O
: ~1 P5 k9 f O2 `, r: T- [输入和输出结果数据样例: 8 j% y1 K% G" w5 O% ]
3 T7 E/ T1 l2 n; |7 f输入样例
# I5 o J, t. q6 I: T/ F8 q- ]4 E& [6 M& L
3 1 G2 m( x3 D( s6 V
# `* q4 N' w& [# p23 7 h5 G+ A9 q& p- O
- l* \7 H, o* j/ [) N3 _7 X, L
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
( H$ g0 ?- R( a8 E1 e1 Q, } B6 P& j) e7 Q& e& ~+ {( z. _# F
25 * |) \4 l: @5 H' z: \) l: H" x
# z) X3 s2 @- U+ l z. @" g
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
2 ~/ T% W3 Q0 F) J' E. V# [' h" ^5 q" d
43 " H9 J/ w# e/ y
- _/ ]& j' Y( D6 K! ?' j0 l
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
* u+ ~, `# n8 _) L2 K+ s7 y) C 4 h) X P$ Q7 ?. Y1 @7 {" q
5 g% w+ R2 x& X- T# q1 w; c2 S$ L% V3 [
输出样例
0 L+ Z! r( e* M+ }" ~4 [* H; l: E
( f4 a4 Q. U g/ i7 H+ F5 \21:17
! R7 y. w% N6 F5 K8 u
$ n, b3 H* X p8 M( h- i24:22
" V. U5 y: I# V. q
& ? x4 |5 V9 Z1 V6 ^: f21:3 , w( C) j& V& J1 U$ b+ f
7 N/ J3 Y6 _) @/ r% b' cUnknown & N- O; s- {# b/ R6 D
* p$ W* @9 t: b$ p2 S i8 p" }- y' b21:14
- r& w: ]4 d$ c7 O2 b m0 q& W5 o# \' ?9 m
20:22 0 r B) }; [0 k! F6 ]5 H9 Q
, |1 @4 f4 R3 |* G2 _1 B1 ?% g21:23
5 x3 h6 r6 ]7 z' D# u0 M2 W+ @
( `2 Z6 h( }- r' A* J21:16 , n' f! S" u% K$ p6 p
5 u4 ]$ B# }; k4 k9 e f) f R3 J
21:9
8 a; S" x# J' O! W3 H % N- D9 I8 c" Y6 S4 ]) z! K* ]$ o
; G% a* p8 ]4 b% T
example: public class GouGouShiJiFen {5 @, l3 L3 P7 z/ w
9 a4 t$ g8 d3 y3 e" |9 E* g4 n \ public int[][] bs = new int[5][2];//当前可能的比赛结果3 S$ ~' d2 C3 Z
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
! c) _8 V8 G6 c$ S- Q// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
- v4 j% `! x7 F- z* }8 u+ C5 s// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown: s* ]; G+ t9 Q# V4 t5 l; F
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
: f9 a9 a& j: t( E* i1 s L( {* a- D9 ?( Z% f
/**
0 F# H6 Y4 @1 T( o * @param index 连续得失分的index) h' O$ r5 s& Y! T/ f
* @param scene 第几局比赛) h" O/ v. s9 e+ K6 J7 M$ d9 s& X
* @param whichPlayer index处分为哪个选手得分
% ^8 l3 \" F' n2 t/ O$ ~, z5 i6 W * @param record GuoGuo记的一行分- F- ]& J3 P( g9 W
* @return 是否是一种可能的比赛结果( H% t, ^. d9 |
*/
0 }% {5 I6 e# m public boolean check(int index, int scene, int whichPlayer, int[] record) {
! N# c; @. i: J int playerIndex = whichPlayer;
& c$ O, U0 N; ]: z1 N$ ] boolean isWanZhengJu = false;
0 M) Z/ F. ?2 l" ]8 Y& _, r for (int i = index; i < record.length; i++) {, `6 p( @$ \% L& ]/ z$ {
isWanZhengJu = false;
( S, b# P1 B& p6 l+ K5 ~' S playerIndex = (whichPlayer + i - index) % 2;) X. c; |. L4 c: ?' a/ q) S8 K
bs[scene][playerIndex] += record;6 M' V9 f3 r2 E# W
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局$ F; @6 Q5 m& ] O: c: n
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
- r# B- y- z0 k. Y; \& P scene++;
- n9 p4 m+ ]' b8 y) [* [ d whichPlayer = scene % 2;2 {* [4 H0 ?$ P9 a+ S7 O
index = i + 1;" X- g- h0 n7 F* N! \
isWanZhengJu = true;
/ m( Y* Q+ l3 q& n continue;& `0 t5 }$ a. N+ p1 A" `
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的) ]) T8 {8 s1 _: H/ k
return false;
- J& p5 ?, Q0 l5 a# A! b) r }
" C5 a" d; }" n+ r F } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
' s. u; Q6 q# C return false;
; J; c% A* v1 |- \+ m- m } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束" b- ?/ G }- w* S3 \
scene++;* {9 a0 ?! [* T
whichPlayer = scene % 2;
" C6 ]1 B# ~2 @5 S index = i + 1;
( w: D) V# O5 [8 U isWanZhengJu = true;% S; t: L5 z3 n
continue;
+ V5 {) f2 L: q$ }( C! u, ^ }
( }! c7 }+ h# W' l; B if (record == 10 && i != (record.length - 1)) { //下一个数分情况
: i7 Y% p5 Q F8 W& Y; e" p int[][] bsBak = new int[5][2];+ H3 V M W2 @, p$ ]- N' O
cpy2deepArr(bs, bsBak);
! K; [; C- T* N1 Q5 m9 I/ Q' B if (check(i + 1, scene, playerIndex, record)) {. K$ n) a9 n& x4 E/ |( }
cpy2deepArr(bsBak, bs);
) o+ Y. a, H% B! z& F" o, J1 F+ D if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误
: C8 o3 d1 _( o1 q return false;
; P" K! \' k: T" X; X& z: _2 X }! M0 w3 A9 R4 r, D
return numOfAbleJu < 2;$ ?2 `" x2 Q% H& N# n
} else {: N9 p/ O0 \" D) P: g2 N
cpy2deepArr(bsBak, bs);5 C4 y: ?1 [- w0 J0 `6 Y$ m# N
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
4 R; t0 o. g% U; _' V+ t; ?2 X return numOfAbleJu < 2;+ h2 a' {9 t6 x2 w# V! ?9 f
}+ i; g! C0 Q* J4 ^. b( s; _
}
6 G- M5 }: | N* I- H4 m$ j return false;5 H3 t! Q! K) j% }: b* W
}" p6 T, x' D8 ?9 p; G& ~
}
7 L! t( g, w% ~4 r! G& E4 y$ c
, v& M# B2 @ A1 ^0 o if (!isWanZhengJu) {
. j. S2 C; I& `: C5 R0 d) W5 ~ return false;# Y/ |# z) p1 n& p" G0 a
}: C6 C, v; `! Z. f9 D9 _, S9 z
// //检查是否符合五局三胜
" D+ g' a) d1 {2 \4 C, _4 r// int a = 0, b = 0;
9 u' L' s) S- t8 u7 S// for (int i = 0; i < bs.length; i++) {# [1 y7 Q/ r9 W1 `
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了( k" T" ~5 o: B8 ~1 g0 B
// break;
. O5 i7 p% C5 L/ t: W// }% s4 w+ I. L$ r
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制1 R$ V+ w' B5 U$ p: K1 G% [5 D: u
// return false;
: c; [$ C! S0 ?/ L$ H// }
8 m4 A9 t& |* e0 b" V$ x. Y// if (bs[0] > bs[1]) {2 O# Q& e* M4 C. G7 e
// a++;0 e* A, U% G5 s' H( D% W6 g7 l
// } else {
6 ^" e- G. H# i9 x' m// b++;% P8 B0 {- u+ w+ F; Q, B
// }7 a# `+ a6 y# N
// }$ x y% y7 B+ u; a7 f1 |' L1 H" n; i
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
6 D4 K" N8 I8 U9 W* a// return false;
) v2 g5 H( `3 r; T& K% h2 [// }
4 l9 i& C. W5 L0 m; F //只要有三局及以上正常结果,则可视为OK
1 L7 H# R: E8 B int count = 0;$ U) Q! t3 B5 _7 g% U% v
for (int i = 0; i < bs.length; i++) {3 n! h6 }8 `- m
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了1 w, _" E( V( c: y' n
break;# c5 Z* Q# G' v% p
}
4 V6 h, _7 N8 L2 _0 L8 `/ [, e' I6 @ count++;5 Z+ q# m, b& D
}1 K- h& n6 W: j" H& s
if (count < 3) {" k M4 p# s; B1 d3 H/ r
return false;6 f, H+ b: e7 {) [; ]
}0 O. e+ R0 v. q7 z, ]. n
# |% e' n' c/ Y0 Q b* v, W0 R numOfAbleJu += 1;2 x+ ^) |3 X5 @9 }8 k3 a
return true;
- K# w0 @! P2 I1 I* K1 X! C; T }3 T; R) \7 P, B5 `3 W) R
private void cpy2deepArr(int[][] src, int[][] dest) {
|4 _2 }; s5 t% }2 y# T: s0 P; T for (int i = 0; i < src.length; i++) {, ^3 n5 c% ~" f" l! N# A: G
for (int j = 0; j < src.length; j++) {6 a- e; g! I6 i$ P! @* y' z ^
dest[j] = src[j];; S( y+ W$ Q( }/ u1 ` V$ E' y X
}7 U; ~2 q$ Y+ W; y
}
- M' a$ W' {8 W+ [7 J7 j/ Q }) c' f& F* N" `7 g2 D" G7 W( A
0 J) h5 ^& }9 C
public void printNowCheck() {
7 J' N, K6 ^8 ? for (int i = 0; i < bs.length; i++) {
" r2 G: G/ D' m' h9 i4 o if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了% M; N. B" T6 F d; S+ W
break;% E0 n! ?) D( D6 D
}
2 c! K- k7 S# P3 _- ] //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
/ b8 T9 ?+ W9 M- F# J/ u$ h if (bs[0] > bs[1]) {
& i: _5 ?3 Z" e) e; s: l; V System.out.println(bs[0] + ":" + bs[1]);
3 O3 y+ J" _; g- b } else {
/ ]( x2 P( \$ |/ W6 X+ ?+ H System.out.println(bs[1] + ":" + bs[0]);
n6 z+ n1 f Q% Y }
4 O! @$ I2 }2 _4 e: [& {2 Q# O }
; i; W g5 m( b f }
8 D% U T0 q5 i/ R7 Z+ n public void resetCheck() {
3 z( B% A& _4 N) q. `( c9 g for (int i = 0; i < bs.length; i++) {
% g4 S+ P. l# X. a8 [( b/ M bs[0] = 0;
; Y& O2 m; I% c9 R( O! `1 w bs[1] = 0;
8 n- H7 ]* b2 k4 i4 b }3 A' G' l8 n9 w2 ?2 y! v! m( Z
}
# s5 `7 Y! r! ]# U /**. k, z- E. V8 N5 F; H
* @param args
5 S- k* \/ P7 n3 S6 E */' \( n$ W7 i) J# z) V8 k
public static void main(String[] args) { m0 w2 ]/ F- n; G6 o+ k
// TODO Auto-generated method stub7 Q @) H5 _8 y8 {" P
GouGouShiJiFen obj = new GouGouShiJiFen();& Q, d q: H6 G8 ^3 L
int[][] testData = {
6 {, q l6 b' V8 D# N {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
* ?: W( B+ e* b" ?. [" F {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},
4 X' U" G m' `0 P9 r; z {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}3 `9 q* K' O8 h. n
};
( ~+ T. E& U, ` for (int i = 0; i < testData.length; i++) {# F7 f" b9 m' x( v; w
if (obj.check(0, 0, 0, testData)) {& M* t* s3 ]8 G
obj.printNowCheck();
8 y! h7 d7 p& \( X( x0 O } else {
/ `+ d. r; ^" ~- }; T% C7 J System.out.println("Unknown");
3 z& D3 ], Q7 ]& [$ D* F }4 s; K! L# ]) X% D: ?& [
obj.resetCheck();
1 Y" a( X" e' K6 q$ b4 L! h* A/ U% ` }
: V* D* H: n. c5 G3 r }- v+ U; p/ A! ~
7 l0 Q2 ?% P5 _& m* k
} |