题目名称:蝈蝈式的记分
$ n+ {' Z2 e8 i2 [" P2 m# ^# G3 W$ y+ P$ \; y( O
内容描述:
8 V. u: C$ t- D8 V! A* R5 s- m8 u, R, K9 T8 t5 [+ @5 {$ t3 q- I
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 / x, H& Z# w4 a& |
4 G. f) b( b/ ?) B, X, ^; a$ V因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
3 N7 p1 \4 H" A1 x# }4 s& n# s+ @7 N" [: G
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 - m/ J7 ^) m8 k$ ^9 X: ^* u
$ {) `8 S/ |8 k- ]输入数据: + B3 c F" o2 I4 S" L7 U5 d
8 [' V/ t9 [$ S6 B& k0 U
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
* f$ U, D& q* ]5 t; j- E
0 m6 I- B& R7 @4 Z9 D输出数据: # G5 D" c6 J+ d; U9 [0 _
! |% ]# e1 j" G, r
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 6 N4 x6 _) l) Y/ L- U: i
/ i+ u1 }7 u5 [# `6 H0 ^输入和输出结果数据样例: 7 O: j/ _: c; @' y3 j: ^+ y
* n( R' S9 U% Q* c
输入样例
; ]2 L& }' x3 P, N0 ]( X7 ^9 H A! f9 X4 H( k
3
! q9 Y- t& L) R5 I
0 I, F2 v3 e9 E! e23
M4 m( w- [4 T
5 c* Q0 X( h$ l s9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 % M+ d' P' U: U0 L [
4 u* n/ G: Q) | P* l' Q
25
& S- j# B" b' R: V5 z2 I2 C' b) s& O1 ~2 U- D* d/ P7 r' U
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
9 T6 J. B4 r" j9 E4 r) M; I( D4 y) S3 q' x4 C
43
- ]2 C4 E) \- ?" T, T) z) o1 G; ~( }, q- d
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
+ t' ?7 q: \- h, d # K6 `5 W/ l/ B/ X3 T1 ?9 h& L
5 b/ u% N; N7 A9 m输出样例 , a+ B" Y9 d) G) d
& Z* ^8 K7 r- x* L
21:17
: \* D9 p0 X/ j$ v* x8 B6 \5 q' |" _9 S
24:22 2 q& o' m; z7 r
/ V2 C' ?! W, b6 j21:3 + o& @! l3 V* b! A( k+ |
0 B! B8 i( F/ K' f& f8 W# yUnknown
0 K6 Z! ~& N! n+ q3 \: ^6 E& p8 @% {$ g1 ?) `: n# g
21:14 9 l5 p* z8 V* W& A
, j8 F* O" m+ ^" a& Q20:22
& L% G' ^$ ? m$ f& ~4 p- Z1 z; v# K# p* Y" n" P; s& V
21:23
; r4 B1 s4 E" g1 u3 m* w2 e& g J4 Y8 d" j8 J; V9 E
21:16 . p' I) I- I* C0 T% ?. \$ Y3 M
: I# T$ y9 L L2 c1 c) x21:9 % O T6 y& Y6 }" O) h2 n
9 R+ T& N& J% ?! u
$ V, y0 ?6 ~0 b8 \example: public class GouGouShiJiFen {
* `$ e1 b& Y; ? W9 |; L$ A/ j9 Z0 o' i
public int[][] bs = new int[5][2];//当前可能的比赛结果
0 d3 \5 | m0 Q9 B$ H# U// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果& X, G4 b# B& A, S/ x# u
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
$ ^) S8 J1 `& W3 F) W// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
1 Q5 I, N' D, j$ I, ?, L5 [& n' K1 l public int numOfAbleJu = 0; //本行比赛可能的结果有几种
" c2 U% k" p8 ]% T/ k- R . ]* m# Y- r- F1 a0 u7 ?
/**% }1 m) _# A- u2 T
* @param index 连续得失分的index) [; Y, c8 W. c2 F3 @
* @param scene 第几局比赛
0 ^" V' v1 t( U+ i * @param whichPlayer index处分为哪个选手得分0 b0 h5 U7 p) l% v
* @param record GuoGuo记的一行分, _/ e8 I+ n4 G, a
* @return 是否是一种可能的比赛结果 k/ T/ W+ V9 I
*/
! n) x% j, d1 o& x public boolean check(int index, int scene, int whichPlayer, int[] record) {5 @# [% y+ m* r# ]( f
int playerIndex = whichPlayer;" h4 |: B3 Q: T5 b
boolean isWanZhengJu = false;
# Y, |% Q) Y6 Y; \# i# y for (int i = index; i < record.length; i++) {( f/ R; f' Q* f# _
isWanZhengJu = false;
/ j3 w9 P" o+ a* e& I$ h- k. s3 T playerIndex = (whichPlayer + i - index) % 2;/ O9 b2 N0 `# U# Y6 t
bs[scene][playerIndex] += record;/ t: @9 h7 \+ y3 \0 }8 \ c9 G- T0 ?
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局 G! Q4 x6 }% b9 {
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束9 {9 @. t" w0 X% f9 S {
scene++;% v2 ]/ R7 N" Y
whichPlayer = scene % 2;
7 g4 x3 u* V5 _, K+ O, j/ Q index = i + 1;8 N9 W6 Q9 ?5 Y8 g p8 G4 X
isWanZhengJu = true;
7 [" M* _" R- s$ W$ ? continue;7 q/ J9 w. i; x2 E5 N$ n
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
& G" k o2 c8 N/ r+ q; G* G return false;: }% C! @6 U( L+ G3 ?! [: H4 _
}& K W4 |, L# _4 r- q
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
$ Y8 t6 h$ q! k; Q* q9 l0 c return false;
& M& P& J' O1 B& i3 R; x } else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束, k: {! u5 t# T; _
scene++;9 T: x) V- z& D) w: g
whichPlayer = scene % 2;
" h9 K* t! J. S. ?" f' x. X index = i + 1;
/ T, k8 `/ Y. M6 v) I3 w; \' G isWanZhengJu = true;
2 I$ L7 K# }- {2 _" @/ _4 z$ L continue;
. g8 }, K6 U8 m# x5 {6 i }% b1 P+ e5 _" ]0 p
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
& O7 b# o6 S$ Y# R' g3 b$ B" i int[][] bsBak = new int[5][2];
, ]% V; y( ?$ C* j+ c cpy2deepArr(bs, bsBak);" z' E( ~- O0 O# q
if (check(i + 1, scene, playerIndex, record)) {
" i; T9 }2 e; m; G- U/ [1 ~8 N cpy2deepArr(bsBak, bs);
1 K" t8 W, f; @ if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误3 n& l" s+ h& ~5 ?
return false;
. n( Y7 }8 C7 f! C( \% e }: L% D# w- f3 g4 |# R% a* n" D. _
return numOfAbleJu < 2;
* k- r% B8 t/ o( y- A- i) H } else {
4 |, |* z+ R* q+ [0 a& y/ G! d cpy2deepArr(bsBak, bs);
+ Y9 B* Q! x, h/ o; y/ c if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
1 L; s( Y0 l- D. B+ J: x/ p1 P return numOfAbleJu < 2;* n& w! F: A3 |# M6 J8 V% u# i
}4 b/ a D, O' i2 j: T5 E5 {9 j
}6 [' c; Y* S$ A$ W, W' S3 d
return false;5 B- z7 o) J5 m8 O' p" l" X0 U
}
2 A3 P8 e1 u' X' a }
]/ H3 _3 R6 `3 o
+ W7 [( [8 `0 y1 [. S! x/ H& q/ o if (!isWanZhengJu) {6 \1 R+ p' d4 s2 g6 C
return false;
+ e. Z7 Q& } D l7 c) I }; X5 Z% S0 U6 H$ D& T& _2 X* ]0 Q
// //检查是否符合五局三胜
1 H, e/ A6 ?0 H- `2 Q. q8 W' a// int a = 0, b = 0;
( }! k! h: p0 b+ M7 ?2 w// for (int i = 0; i < bs.length; i++) {
8 x6 x" j9 q O6 s( F" ^$ Z, `// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
' Y3 i( h7 Z" t9 F. ]8 f// break;0 f1 S8 p. R7 a: v
// }+ i" G' j2 N# q- y: V' @
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制2 o* C- B' n5 ^* r7 g" \5 w6 A! Y
// return false;
4 @+ k1 y7 k( O9 s// }
& G. P* R4 t# o" v" n" P+ J// if (bs[0] > bs[1]) {3 e/ G3 @* X+ [: N+ S" _1 d0 ~& V
// a++;" W' b( j+ Y5 U% T) j* ]7 S
// } else {; | D1 S# }5 {; y6 C z; n0 t
// b++;9 f3 Q$ A8 _+ ]" Z
// }
$ o; p) O9 Q" N/ P// }
- e" {( P/ i( Z& Y1 z% e) P+ L// if (a < 3 && b < 3) {//没有一个人得三局,故错误
& S* V0 G9 v+ o) g0 Z2 ? M5 V// return false;, k5 `/ A m6 Y/ c
// }
m% S A4 u3 F7 p3 d& N+ Q. E //只要有三局及以上正常结果,则可视为OK
4 m5 | A |9 W. p# A) d: T+ _" \& A int count = 0;: B2 l( j3 o1 q& x1 y$ X w4 {/ J
for (int i = 0; i < bs.length; i++) {
5 g$ e( W1 G4 j2 h$ q% F if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
; p9 J7 Q9 c- W9 N% q break;
4 R% y' c* d$ J' C0 E! R } A7 r' m# N# R$ p
count++;4 m d' Q5 H4 A+ |$ a7 @
}
# i, }4 H2 x+ Q9 h8 {4 m if (count < 3) {) _/ b! h6 d7 l; q; @6 H
return false;' H1 E0 ?( |1 l: v8 w
}4 o! F# w: m8 w' C3 A$ w y
0 a- e4 C* A, D7 l" r5 Y# j
numOfAbleJu += 1;
$ F: F. B4 R, I0 b5 a return true;
# [% s* x" G1 T5 Q! a& v# x }& a# a1 A O, j' }# J6 _
private void cpy2deepArr(int[][] src, int[][] dest) {
- M( ^3 J2 ~# K3 `6 D8 W4 S$ v for (int i = 0; i < src.length; i++) {
5 z2 x" H" Z9 W+ y; t# t3 ` for (int j = 0; j < src.length; j++) {( ^) y- |+ ~* n' A, l- F, r( w
dest[j] = src[j];
- g# w) C V- |. W4 ?( |' S. O }
* `1 a' _! E: R6 S }
X* d5 i, \( m( q# s+ X& f8 @ }
: v5 U8 _3 v1 ^, W
% c4 i/ {) t3 m% {' \ public void printNowCheck() {
2 D3 O$ I% ?/ M: d/ l" k for (int i = 0; i < bs.length; i++) {
' J) N* j3 V6 ~) ]& Y if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了- Y) G/ S% ?% S c+ W
break;0 k* X+ a/ }5 ^
}; y, W# d! m% ^- o, D* v
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出) J8 h8 j' @5 f. P$ C
if (bs[0] > bs[1]) {4 w$ k5 k, l$ `6 v4 b. x
System.out.println(bs[0] + ":" + bs[1]);
) ~+ l2 ~2 M1 t. h! u } else {/ }) L9 |5 T: ~, r2 M5 r; P& ] H
System.out.println(bs[1] + ":" + bs[0]);( f2 O. k$ e$ Q
}0 [' @% L( n: {. ]0 ~$ _6 A
}
% V2 i% I P" ^ G1 E4 u }
, P' T' G* ]$ j1 v p" ? public void resetCheck() {
u, j# [% S) Z* ^. L. a& K6 P for (int i = 0; i < bs.length; i++) {, [% E# X6 p8 n0 K
bs[0] = 0;
* L5 Q; X- }- v# N bs[1] = 0;
. A; R. e5 H# T# C/ v0 J }
0 ?( a4 Q0 d, L/ i }
; E, g4 v; j) U, ] /**
; e6 s. ^0 s8 V: x7 D. w * @param args+ J! `0 i3 Z. ~
*/2 Y. H( R- `. K$ ^5 E) V% J; w
public static void main(String[] args) {
7 f8 F$ s2 I4 }, K, I1 V // TODO Auto-generated method stub
) d8 y, i! w- e$ t2 ]9 H1 ^ GouGouShiJiFen obj = new GouGouShiJiFen();
. |" `+ Z* z" a, o+ ?2 r& ^! | int[][] testData = {; T( r# S I8 [
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
/ H0 N# L* j X3 r+ ^ {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},0 i0 u# G1 |: o! ]+ I
{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 O7 V& c R# n; W9 ^! F
};. W) b) I1 H8 E+ _" ^
for (int i = 0; i < testData.length; i++) {
5 V& ^( V. D% H+ c if (obj.check(0, 0, 0, testData)) {/ n/ @7 Z' `( G: M; }( L
obj.printNowCheck();: f7 |5 Q/ x7 D8 V% s$ Z
} else {5 `6 }& W9 Q4 b5 K& ~' h; l! D
System.out.println("Unknown");
* [8 a1 x; m3 {/ o }% s5 ^: ~; }. f$ d$ \5 N
obj.resetCheck();" K% Q8 E/ r) V! T
}
) [. T7 z( |9 j/ Q }
4 a; Q$ a3 ?) J/ L% r8 Z2 x" T4 s
} |