题目名称:蝈蝈式的记分
\# ^3 j3 j5 h3 q. Y$ w; N" O4 q S. r
内容描述: 7 y7 n3 C8 n: J% q2 P7 N+ X* N
7 s6 \0 r9 I1 \, ^9 n! B! T
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
! o. } d# @- d& K# k# C
0 |2 S: g- A7 V( x因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 5 m; @8 b& M5 Z! B$ [$ W
( y5 A0 y2 R) W, {
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
% R: X* m& J, c1 U2 }6 r- ]9 O$ a. c+ E) o2 x! q
输入数据: & r6 C4 C: r$ b, h; a o0 k+ p
1 `5 c' N4 H# d+ T4 O, L& m4 p
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
' x3 y2 L5 I3 z4 P5 P0 p
, F' d1 d# ~4 i! h( T: x输出数据: |# s0 E6 A7 h, F# _
/ m7 W( N) ~, j1 y) y% H. G% I0 d相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
9 T1 T+ Z3 a" q$ t% {- C& v, B. [% a
输入和输出结果数据样例:
5 r1 W! @, I8 t! Q5 @7 z
2 S& O0 r7 {1 S4 h输入样例
8 `; a8 n9 n" S0 Q6 T7 \& `
/ U" ~) `) h" x5 r3
# X' w; J3 |: S
1 q' D0 _: A* H+ E/ ]23
9 K {, I+ w& @6 k* I7 B' ]
' |5 s& E& z4 W3 g8 b% s& o; S( x9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 7 J: N' L! r7 ?0 R: h: {& O
2 |8 S9 K/ b$ m2 r
25 5 Y, t5 c, M3 H! K( U* \
8 V9 k' `( D+ h8 V$ ]4 Y* M
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 0 N; @1 C, R2 l
7 \3 t, c7 B1 ]" C43
8 M6 }8 m$ f5 V) `5 `$ R- ^& J2 ]& W% b
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
5 P6 F7 F7 }, n3 B3 _( A% \5 w % l: S" B f& i" m, b, Q3 e
4 ]+ S, `$ i: G+ v! k输出样例 2 K, Z: F3 H, ^2 m* k: {+ `2 F
- m$ k$ J4 e' C- N+ b9 `, L
21:17 - B- f4 ?4 }9 w- \% s2 i
' g! \8 C# C# b+ Q- I24:22
1 w+ p( [) a' Q9 s" r Y& [( N9 M. S9 a
21:3 ( l! V1 \# w8 ?: Y, E8 o
. \9 |9 F1 g! D5 `& ~/ h* ?Unknown
' s6 B6 R& h) A1 [: I n( k9 }
8 o1 q# t- ?$ d- j21:14
* u5 a; f [7 S. \. F, t: Z) f2 e5 G) ]+ u" Y3 R* F
20:22 - O8 S! W4 z# D0 d1 n& E6 ^: G8 B
' _' i' w) d% D) Z; Q) I- o ~
21:23 % X' H$ Q# K- l/ s. b
# |2 R/ x$ [- |7 q7 d) r21:16
7 Z8 Y& n; E/ B4 R& e8 z$ |0 x# H3 i/ ?
21:9
# S/ \9 i2 S" P/ T+ u$ ~# C 8 R3 x n+ Z6 c+ r' X6 x
+ K" A2 t% v- |example: public class GouGouShiJiFen {) }# |" P* B) ~6 K0 W
2 b' ~+ x* l8 c z public int[][] bs = new int[5][2];//当前可能的比赛结果
2 D+ }/ L( N* @* K$ r6 ]% P0 [0 E8 f// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果0 M" u" A8 u; b6 s- x. m, M
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
# _8 Q' ]4 H8 _) S" m+ h1 L// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
3 k3 {, [6 u" t: [1 v0 ^+ k public int numOfAbleJu = 0; //本行比赛可能的结果有几种
: D" R% x& G& t8 t8 Y) p) n ! r( n8 a$ B* r4 O8 R
/**
& v; A' Y l9 x [ * @param index 连续得失分的index- r3 B' _. a4 e, t6 [, W
* @param scene 第几局比赛
+ u( n( `6 D8 l5 `4 G% |3 G! R * @param whichPlayer index处分为哪个选手得分5 s1 d; d/ d8 w5 m8 X
* @param record GuoGuo记的一行分5 ^) b( W }8 M, U# i
* @return 是否是一种可能的比赛结果% T* x7 X1 n4 R: X
*/1 g/ Z) [$ F' r3 m! m$ P) e; W& `; ~
public boolean check(int index, int scene, int whichPlayer, int[] record) {
4 s, x0 a% A$ j& F: a7 x8 z int playerIndex = whichPlayer;- ^# H: W4 \' M, E8 X" I
boolean isWanZhengJu = false;# I3 ^2 e M U
for (int i = index; i < record.length; i++) {
- Y/ @" S0 w0 s/ f. {: \9 i) R! t isWanZhengJu = false;
- T1 v1 X0 J/ x! s6 G( j0 l playerIndex = (whichPlayer + i - index) % 2;
3 V2 q- O3 u c% H; a, g2 [ bs[scene][playerIndex] += record;& t* e1 g* {" L0 F! k/ F
if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局+ w2 c( U5 g) f4 U2 g- O4 I/ ` `
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束
4 r# y9 ~* S8 A scene++;
. i, H1 W$ l- n! T whichPlayer = scene % 2;
) A/ v5 P9 J" v& t3 e& h+ v index = i + 1;" l. q) h3 A+ g3 O
isWanZhengJu = true;9 {) R a1 _5 N- A1 s
continue;7 O* d. H% c! p: I* l9 s% B
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的 G# \8 k8 z8 L! Q& R0 ^! F
return false;
: _* u9 B" w( i7 P1 P }" }8 W& k" G" `' p7 Z) U
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
, x0 C" u3 t' _, U return false;% R7 b! F: A, U* D9 q2 o
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
" \9 W) Q: | p2 i scene++;6 h( m0 P* E2 K
whichPlayer = scene % 2;& i/ }$ G- I! {! b! S+ L1 M) r6 n" L
index = i + 1;
# ^* C% ?' K5 F8 F4 P* L* g isWanZhengJu = true;
, n3 q% m- Y5 z: y4 y) } continue;
! h- G, ^$ i" {/ `- L }+ [4 B5 W* m5 }
if (record == 10 && i != (record.length - 1)) { //下一个数分情况9 _8 l/ s. D( J6 y, j6 K4 J
int[][] bsBak = new int[5][2];
% j, i8 Q) p1 o N cpy2deepArr(bs, bsBak);! x) D; [) k7 [
if (check(i + 1, scene, playerIndex, record)) {
8 C4 @$ r* X4 h) u0 e; `1 b" k) o$ U cpy2deepArr(bsBak, bs);- ~/ r ]5 X- S+ O& \
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误" y4 G# ~' o; I$ g4 k
return false;3 V8 p1 b$ @5 m! [" S
}9 m- h" m# }; a0 q& P
return numOfAbleJu < 2;
$ _) D8 ^( J9 s# J, {7 H# @; X } else {4 I* U! P2 p: ^, b- S' H6 W/ c
cpy2deepArr(bsBak, bs);
* B' S5 |2 r( l. k( C& X( a if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
* j2 t1 c. @: P: c/ J0 g return numOfAbleJu < 2;
, L' k2 I/ {( E0 b( w8 J* P) ^: h }
8 C3 X/ X. y. [5 R3 ^! A }
8 q; f3 R! D* N4 R% P- L- {% E return false;5 G# M; y; Q* F
}- H4 K/ z c4 b# s
}
. b- N8 Q5 }$ L# ~2 c
; m4 z1 w7 c4 ?& K5 b. j if (!isWanZhengJu) {
4 [+ {1 X1 @! k# n4 ?7 \ return false;$ B8 d+ Z- H6 T
}& i" j# k7 V2 J; r
// //检查是否符合五局三胜
( r! z, j1 R: b6 a& C- z// int a = 0, b = 0;; |0 G0 y: ~2 p, H; |0 S
// for (int i = 0; i < bs.length; i++) {+ G4 f% _& o( e7 i! G% B
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
- P \- g+ ?, {4 j5 R$ W// break;
+ f) [- \% O/ ]1 ]// }! Y7 Q* M2 @5 R+ [0 Y- T
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
% }8 R0 `0 {$ z3 n1 [' H// return false;9 I, c$ ?4 F" b9 [+ C
// }$ [+ Z, z8 R( N2 J+ b7 Y; \" {
// if (bs[0] > bs[1]) {
7 p3 l. i% {" T* O- h3 `+ e// a++;, k; V/ q5 R, j5 \5 a
// } else {
, X4 w! I& Z, ~" ?; k- _// b++;! Z% D6 T4 N+ P- G; i7 Y! n
// }
; Z* J( G; Y' {$ t9 a6 Z) q2 x// }# _% u4 M' D; f3 x0 L9 q
// if (a < 3 && b < 3) {//没有一个人得三局,故错误) f5 w) `3 f* v1 ~8 `
// return false;- v! h( ?9 F8 R
// }0 R4 O8 k e( P$ y( ]
//只要有三局及以上正常结果,则可视为OK
5 }) ^. N* a, ~8 ^, r e; O int count = 0;
' P# q; J# P+ g9 D for (int i = 0; i < bs.length; i++) {
. X8 W+ s+ l6 D' d& P7 a if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了' u1 _( m6 L3 A5 H* X. ^
break;! b2 o8 @3 u) k& o% z
}' b, H8 o# V7 v8 ?4 {% z) Q
count++;
/ f- P; |* {* w) p }6 ~! D+ S! E. B' ]9 l9 F- p( S# {
if (count < 3) {: V1 q$ Z$ F u0 s+ n. Z
return false;
/ s+ s0 R6 v2 u* H# t4 g; p3 g% T }7 h$ H: E: `1 h1 h9 l0 R; n% s
% \/ V# O7 e9 B* ~/ o. \
numOfAbleJu += 1;
! l* M- z6 |" B9 J) [ return true;
$ O& ^6 }' d2 t0 ? } a7 s( L9 n9 b. {/ T& ^
private void cpy2deepArr(int[][] src, int[][] dest) {
) Z3 T- D8 K ?0 E: h for (int i = 0; i < src.length; i++) {
* P9 Y3 {3 e) `( h( l3 p; S$ e1 @ for (int j = 0; j < src.length; j++) {, a I' {" V6 X9 a
dest[j] = src[j];
1 O' f x# E3 Y* e$ N }
5 p2 z) W4 W0 L }
2 ^* t# W) _+ q- r- M4 { }
; _& j# r7 X& X) a$ w) I' O% S
( a% u4 ~0 a* R public void printNowCheck() {
8 W. j! @' V: M* A: D1 f for (int i = 0; i < bs.length; i++) {6 p( I m& m6 V+ p3 i
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
& F1 I& D- [* j# h7 e break;
0 ^+ @$ y4 K9 W, z7 r% W. x- i. X }
; y( f( u5 j; E. z //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
- D; L N) Y# d# D. A" @ if (bs[0] > bs[1]) {# V2 Z7 w& N/ S% t. D Y" X$ q" a
System.out.println(bs[0] + ":" + bs[1]);
6 O8 T+ |" o% J7 d: x# }( m } else {
5 [) Q% Z9 L2 a: P: j$ f4 j/ T( H/ a System.out.println(bs[1] + ":" + bs[0]);
4 x' `' T$ j3 i" b2 H }/ C1 n9 \: N* ]3 f$ W6 h: @
}$ \' O: k$ F% k+ ^4 m. T: q) n8 g
}
% z! h8 a/ r7 w& K' u public void resetCheck() {
; u# U# X3 s2 M" t$ a for (int i = 0; i < bs.length; i++) {
& x4 b: r- a4 I* o* Q bs[0] = 0;
' D5 n8 h/ M) @# \& a bs[1] = 0;
3 m+ y$ P$ o- C1 _4 A }
* l1 X' C) O9 {0 o$ Q }
l. G# v8 w a /**
$ W6 H( S4 Q5 L9 }* s- N2 ? * @param args
+ M7 O8 `! v! S) H+ B8 B# E */
" C c( V/ k) s' K7 K& `2 b public static void main(String[] args) {! M7 Q0 g: K. c. F* e
// TODO Auto-generated method stub7 R# w" ^( Q! s9 V! f
GouGouShiJiFen obj = new GouGouShiJiFen();5 c) q% @5 z8 u2 D- n+ L" L
int[][] testData = {0 a% { @8 V% w8 p" ]3 I: l
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
/ i2 ~0 r' C- q7 ] O& } H M* Q {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},; A; V% `; d4 V2 M
{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}" B! {1 Y2 _/ r2 Y# `& k6 ^
};# P7 `7 H( t9 t2 I; D. K, i
for (int i = 0; i < testData.length; i++) {
3 v6 U& v' A: W/ G# b9 N2 F# P7 i if (obj.check(0, 0, 0, testData)) {
( J3 ?$ v) X: C obj.printNowCheck();2 G( s5 l6 i4 E* Z
} else {6 t5 b R$ ?! p U
System.out.println("Unknown");
# D& V/ ~* F$ j0 w1 l }
7 [+ p8 r! i( Q) q) l. F5 a, w obj.resetCheck();
4 t; ~) Y# l& g2 |0 v C% i7 G( N }
1 j0 C# c$ H# t }
- ?) q9 u* W0 w) |$ W" H. n {: h" F8 F' i
} |