题目名称:蝈蝈式的记分
9 x, x4 u1 ]7 f" r7 r
6 P, ^9 ?8 \8 j! T8 w内容描述: ' D0 v- D" I* o7 k* k
) k0 \+ t3 S" ]蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
* L' |6 C' E) y, T; `: o1 [
7 [$ y3 ]3 q! V( q( l因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 + C* Y& u, {$ ~5 l% X+ ~
* B0 ?/ K8 o5 ^4 d2 b3 o9 D
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 1 W+ w3 K$ F6 d% x# B
* i" X3 V0 [* |输入数据: + u$ Y) p+ L I, u) f7 H0 {2 h
# d! N% }! b8 | z. F7 L以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。 * h L- k( K/ q1 G
/ b8 i( @9 ^7 {/ w! V) w `$ d
输出数据: 5 r* V' M [ {1 k3 {" g3 Q
1 L$ Q9 X |8 m1 A: f* Q- K$ i
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 % m; y$ T4 F1 p2 j* q9 c2 `* W
. J! O6 @# s7 `, d0 n# G
输入和输出结果数据样例: {8 |# j# d, H$ x. a& x9 ~9 Y- E
# j. |6 ~( w$ `! d& m
输入样例 7 }1 H, E$ r, w1 |, z- B% s
6 M I1 P% M1 c0 D0 J
3 & u2 O# Q5 q# D- \( c: d2 \, p
# F( H# ^* t8 I- ]+ P2 i9 ]
23
- R. J) u) D( l4 M8 Q$ ~- l, A
O0 ?7 N8 e$ Z L( t9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
n8 k7 H9 W$ G; g; k( M' _# Q; i: [( y& _- q& h7 @
25
, w. h; x7 X% [
& h' Q8 s. \8 \/ i7 R5 o" `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 3 _: G# Q9 \' f6 p% E5 W
1 T& v8 l; i% G+ X9 j6 e9 B43
# K9 L, q6 k0 l2 z7 j: T) M, D- ~ t" j, u6 F
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 : k1 S; y: f3 ~; z" c5 a: i7 h
4 m2 K/ [2 E" c# r3 |% m
& ~+ l! Q/ n1 |+ ~7 { J" s" _9 ~
输出样例
% X# |* ]; e6 [& d& j; I* D! r% m# y2 w. _% l( R) h" Z! n+ i
21:17
/ r) \! E% w' ?; r
) K; k$ s. d5 [; Q) `2 Z1 T; O9 U24:22
! I5 ^6 i4 c* }5 U' ?) g. y9 I2 Q6 Z3 J
21:3 ) P4 v* o2 a) I& x3 y" x- z& o' d! R) Q
' r# n" `) X2 G7 ? I' S" v% {
Unknown
, H5 u) d0 k9 u4 i% O# {0 q- {5 Q# G# ]" a ]. F
21:14
) n$ Q2 k+ {) R* k9 ~ G* a
. |+ F* U% z* M0 D. i2 M20:22
* A% V% c9 K) j6 m+ P1 C1 h
* [) X, t X% t2 G* Y21:23
' k2 F# ~" A/ c5 }
6 I/ v; ]/ ]2 X3 z* g1 j21:16 . r S/ A9 m5 f h& ?: m
( i8 b5 s2 V+ s9 A- X
21:9 * Q& c) l* l3 j+ D, c
. f7 `- R. N, E. a9 g7 O9 f$ t y3 M) ^ t2 I' w- W
example: public class GouGouShiJiFen {8 y( a/ V( |) k5 x+ I
7 A1 c# \4 p1 }( K public int[][] bs = new int[5][2];//当前可能的比赛结果- ]3 N4 P0 e# ~" W) {3 _& b6 h
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
) o0 V' }: y2 @, V- o" C// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
" G J/ E2 l5 z: N, T( N5 b: r// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown
8 ]) [4 }$ i& X" W7 ?& o public int numOfAbleJu = 0; //本行比赛可能的结果有几种/ ]4 W$ E# N! _- k: d
4 ^9 s; U+ |. a% L /**
! I/ C6 ?! H( y2 b) ` * @param index 连续得失分的index
$ U8 u& T7 _3 Y9 c- _ * @param scene 第几局比赛
4 T6 ~& Q% x% O0 x% e * @param whichPlayer index处分为哪个选手得分
- x# V' l5 }% Q, e& l2 _ * @param record GuoGuo记的一行分0 y& Z9 R7 O) y( K. \& e8 e
* @return 是否是一种可能的比赛结果& K ~. d8 e- R
*/
7 H/ l+ p( I: b public boolean check(int index, int scene, int whichPlayer, int[] record) {
( C; U- b9 }! W% _6 F int playerIndex = whichPlayer;* C, L* u( K( S
boolean isWanZhengJu = false;- }- I+ {% Z& ?: L. t7 C' F2 V
for (int i = index; i < record.length; i++) {
. f: i, a$ G W( N isWanZhengJu = false;
" Y F3 U4 ^, {/ X' b: q3 D playerIndex = (whichPlayer + i - index) % 2;
3 v1 N! Q; s j bs[scene][playerIndex] += record;
Q6 M. X7 m2 A' B0 m3 i) u if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局% A8 |% ~7 f9 h2 q4 c. v
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束8 q S1 k4 [6 D! v- O
scene++;
. U* }# a _/ h whichPlayer = scene % 2;- @' V. V, v) }0 J) |! D
index = i + 1;
* F" q& ]( K0 L) t1 ^4 @9 @ isWanZhengJu = true;; S9 v0 I! j! C& a
continue;
+ O' J5 _3 |& ?! ^/ y } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的9 {6 y+ P4 u6 ` x
return false;
, T9 ?; q- N0 k Q* m2 I }6 }. T# O. Y' x% w9 _* a. {
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
5 r0 T3 r' d- e: h return false;. K9 O2 C3 O0 }1 T) t
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束+ o: j0 ]& u! A4 e/ K1 y8 U
scene++;
$ Z7 h4 f) u6 S& t whichPlayer = scene % 2;
, o# [) @# ^. H, g e1 [ index = i + 1;; Y, i. U- q( t" D" \2 [ T
isWanZhengJu = true;
. R- O h1 t" F continue;2 X! {: t, N$ K9 n, a. P/ n' U* I
}& R1 y4 j- J) Z7 T
if (record == 10 && i != (record.length - 1)) { //下一个数分情况( I! Z- h: |, W$ W/ h
int[][] bsBak = new int[5][2];. X) W! Y/ n+ J
cpy2deepArr(bs, bsBak); P6 @$ g t) Q1 B
if (check(i + 1, scene, playerIndex, record)) {
/ j1 ?$ I3 e. S4 r cpy2deepArr(bsBak, bs);( ~+ U* o7 w6 M- m, G5 H% \
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误1 X+ ?9 N) |0 b& [2 M! R
return false;2 F4 o, ~( ^5 r
}" K! _6 g4 ?7 o+ z- W: o" H
return numOfAbleJu < 2;8 N8 a( e, s" b% [+ ]
} else {
, a0 ]- x* i" {" Q/ L( {* f cpy2deepArr(bsBak, bs);
% a: C& Z$ {0 W5 }) g if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {7 `4 l( S) u. T
return numOfAbleJu < 2;/ K% m _- w; y5 T9 ?+ M$ L: a1 J
}. x! s4 ?9 g4 j3 `$ u
}# [- P) b3 H. B9 A
return false;
4 K# r- S1 t0 Q+ [) w q1 q }
0 R! l9 I: n# d6 z7 f5 r }/ D# W) m( z+ W" c
# m, B3 S) T' f" g. }( j
if (!isWanZhengJu) {
. J. O$ U' |; K. s. p3 h return false;
2 E- q+ n2 {# U }+ u }4 ?0 |/ p) a1 U3 u3 M0 d! }- }
// //检查是否符合五局三胜
: }" e' r# b7 g+ \- b// int a = 0, b = 0;
- [ p$ t S6 R' n8 j+ ^// for (int i = 0; i < bs.length; i++) {
" O# m- D2 g% x; u8 W5 g2 |5 C// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了& J' |1 H& p. {3 J& } `
// break;, Q \$ H' u- M2 ~- w5 n% K: h* ]/ t
// }
# o: n0 b; J* P9 \( ?% L2 j// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制) u0 x% ~( V2 Q' _% O+ K
// return false;
$ G; a, s8 Y- |# ?7 [6 V9 O// }# L& W5 N* ?. c7 H8 J
// if (bs[0] > bs[1]) {$ O( L; U$ W% ^' V5 P2 I; i, ~) |
// a++;
3 `& \' o/ Y$ U. V, j# w8 ?* n ]// } else {2 P5 j2 N2 o) p; b& v$ P
// b++;$ s/ _2 f# T" B' `) a. i5 X; H+ M z
// }) {) j4 e6 b( ]- e+ _5 F
// }
J K6 n+ A4 T3 S// if (a < 3 && b < 3) {//没有一个人得三局,故错误1 |! o% D1 R4 f7 |% a$ c
// return false;
9 y: o4 i" h" n2 M% R: u8 y+ x// }
9 x8 D* Q0 I# ^! s- @' t: `% T //只要有三局及以上正常结果,则可视为OK/ E) L, t0 o% X* m& P' x, N8 `
int count = 0;' m I# B `9 c" ~7 w
for (int i = 0; i < bs.length; i++) { ^0 i0 G& P9 i l
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
( C* t8 T3 M2 z/ A6 r9 v; m. L break;# X) T# }: a j! w2 S& z3 m
}
4 R$ t2 E k& u+ L3 P# G count++;# i. O8 L2 B9 U4 {4 L0 T; K+ K
}
. e- Z8 s y& h" o, O if (count < 3) {
/ i! c8 i+ ^. h return false; H5 I+ C& V; ^8 V/ }
}1 M2 S0 M+ b5 Q, ]) t- u
7 w; M5 y4 d1 d3 ^' ^; ~ numOfAbleJu += 1;1 Q& P' H$ D% V! T- Y; J' ]
return true;6 d7 P& m: @3 z+ u4 G
}
( T3 t: n% `7 t( n9 [7 {9 i, t private void cpy2deepArr(int[][] src, int[][] dest) {9 x% J& j4 A( H5 }* Z
for (int i = 0; i < src.length; i++) {* ~! |& Z% X" C y# D8 D
for (int j = 0; j < src.length; j++) {
! t F' `9 K" k' | dest[j] = src[j];4 O9 @. ?3 [+ b3 Z4 j1 E$ L( N8 @
}
: t" z/ a5 W) D" p. ^3 V }
- ~/ n4 _+ T- b% q' W# l }( I# P8 K8 |7 k1 P" W) D* U# M# u
- W. c- v8 n1 y- L4 C+ V6 s
public void printNowCheck() {
3 R8 S+ Y$ h) n w! n( D6 | for (int i = 0; i < bs.length; i++) {
- d5 Y1 _& d; G' L s* |* C if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了2 R, K$ T/ }, n& b! u
break;( Y5 Q# a3 m7 c2 L& m V- _7 h/ i, i
}! t B0 |9 Y6 ]+ e1 b! i
//因为无法得知两位选手谁赢哪局,故以大比分:小比分输出
W- i# w& E& q5 @ if (bs[0] > bs[1]) {
: [% o3 Z- P! B* R7 v; l System.out.println(bs[0] + ":" + bs[1]);
3 T3 o8 x) `8 c% u0 R } else {
1 A! B" }$ b4 N* E! @& m System.out.println(bs[1] + ":" + bs[0]);
, `( _4 B+ Z! S5 Y$ k6 b }
4 f7 @3 }' ^) r. f: X1 U" I7 [ }3 u ?' ]+ v1 @9 q4 ?
}; Q& y8 \7 y5 Q x9 q
public void resetCheck() {. X0 A+ u' j0 S% _3 U3 m8 z% `
for (int i = 0; i < bs.length; i++) {4 c. b, T; g1 }, H [& g
bs[0] = 0;
. U0 m+ V9 n$ W6 v9 F bs[1] = 0;
2 b. j! {$ H, O( C }5 ]; A0 C x9 I6 D" h: V( F5 M
}* k( t8 F: b; Y$ W; l9 c- q# @
/**
$ H" m# P: K# U) i& j * @param args
( _+ g! A" l' J$ s0 N- v */( K0 P: |0 n. K- O! f
public static void main(String[] args) {5 I/ c% ]; Q9 |: ~7 d% |
// TODO Auto-generated method stub1 H6 k9 V, Y. O) r) \. h0 n
GouGouShiJiFen obj = new GouGouShiJiFen();
: o! \. G& G) V7 N$ S int[][] testData = {
2 ]) @; f/ J5 X {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
6 ?4 r! N: \& t, l( }9 ~; v {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},
I9 `0 W& x! ~* Z6 T {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}
$ f$ _9 Q2 ]% B* J3 h. D& Q2 v };5 C# ^8 c, ` H! t) c
for (int i = 0; i < testData.length; i++) {
$ ]) ? J7 {; P; @4 j& K5 G if (obj.check(0, 0, 0, testData)) {0 ]& N* t0 Y9 ~8 U0 b# U
obj.printNowCheck();
6 a, o2 x/ A' m" T7 d } else {
: U! R7 i. r- q+ ~0 h6 P2 N5 _% f System.out.println("Unknown"); `: O$ ~# A9 E8 x* E
}
2 [8 c) }. n, ?% O1 I obj.resetCheck();
* ?( |4 F. y/ s% ?( Q1 M }
' _3 {8 D* B0 |, r }- ?0 F3 }9 q/ n9 q2 C8 ?
" P& Y' a1 P9 U} |