题目名称:蝈蝈式的记分
- s" Q$ u2 S: X U7 l9 k& \4 l6 i ^
内容描述:
8 ^& |1 ?6 g- ?+ A1 B' `$ g7 A% j
蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。
P& Z/ q1 Z i. U: b. ]
6 f7 y1 F4 d& G- y1 p1 a0 O$ T因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。
- o# Y6 y2 e, S: u: Q) |+ {7 x d+ \7 D7 f, k4 _2 w1 f
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。 . ?: k$ K8 }7 h4 r( x
- t+ `( p8 X1 Y8 E输入数据: ! v% K4 i/ g5 H: ~ o
' o) ?5 t0 i7 Y: `2 s( i: C
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
. A& E3 a1 k, c4 Z+ F2 c6 @1 z T
/ k" p& m" r2 p, G- F输出数据:
1 u% a! _/ E3 Q& D- |2 ]" n
8 F' I0 l }8 \/ Y- M; ^0 S相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。
8 b4 o. f$ ?* @- G% N' j5 O
' C; g N3 m7 U( F8 z输入和输出结果数据样例: / F4 n Y2 _- O7 D% D0 l
. ^0 a. o/ s6 e( w& n0 w0 M输入样例 + x% G4 N0 u6 C+ V
. N4 O" `3 {" s6 K [3
. B+ l4 l! B8 U9 f# x
; a6 t# [- J$ v c8 ~/ j23 # j& Z+ v2 N Z) ~! t
8 Y- Y3 L5 H8 A! ^. A; x9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1 * Y: d! E$ r5 R* ]3 h
; q& l, S) w& W3 o8 ?1 @$ w25
* p4 g4 Y. c9 }- I# ~5 J6 q
- m& D: k M" C9 3 8 5 4 8 3 9 8 4 X X X X 2 X X X X 2 8 4 9 2 4 $ o( K, _' W. S4 I9 J9 D
6 f# }' n: R/ Z* G43
$ d0 t- n+ ^: {
: c0 Y0 n% G6 ? X2 E- n7 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% R8 J4 S# E5 ^$ { z: C( P 5 d( C$ J5 k( l
! }0 I; k1 I9 @$ N
输出样例
/ A$ j7 y) F% ~/ @, g5 P" y1 Y' w
. |% i/ d i3 {! M- X21:17
/ l: g1 E! }/ r, ]4 A5 o/ t/ r! Q4 Z+ Z$ H: G! r" ?
24:22
8 [; f+ i$ E4 d! h, N3 e6 E' I$ [6 ~2 Y
21:3 - ~5 b$ Q5 b6 X( f c @& m
( f6 [+ O; d3 r7 T3 ]Unknown ' Z. s- U0 d) o6 k: {; g2 _
+ N4 Y4 Z# x7 v' ~5 T
21:14
, y* l! K6 r/ s
7 b9 L; K: `. Z" z. n A20:22
" A8 V0 _. T, Z# r9 N' H% @, a0 G1 x/ @) A) X& E
21:23
) B; |( W& D. g- U+ d% y4 D# s* n8 }. |& ?) K ~# U# u3 [
21:16 % s$ w6 b5 N3 E/ r
7 E3 w+ m+ Q9 b$ \
21:9 # J! y9 U+ F+ Y+ k; ?' b+ @! [
; P2 _$ W* G; P% K; D" ], K+ u( s% g3 D# _, h* v
example: public class GouGouShiJiFen {
/ o7 P: d% B( ~2 j4 R/ ^) D
3 l0 Y1 i6 m+ b- r7 o public int[][] bs = new int[5][2];//当前可能的比赛结果. r% H4 l: v: f% T* D) \/ c u6 h! \
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果3 q0 u j$ O" X6 p+ }
// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
6 e8 s- { j3 E# d. [4 y// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown7 e7 Y8 Q( a1 C; x
public int numOfAbleJu = 0; //本行比赛可能的结果有几种& Z5 R3 Y* Y7 j: \6 }$ v u/ P
% a# ^4 w% I/ o* x8 U
/**
2 r- M+ C4 |$ u; j * @param index 连续得失分的index
( r4 Q7 E. c( U# j% f6 a3 A* d' D * @param scene 第几局比赛" w- T3 i# x+ S
* @param whichPlayer index处分为哪个选手得分
7 P/ u8 ]3 T; b$ Y K * @param record GuoGuo记的一行分5 K* F7 q* O0 F/ M; a; b) n7 `
* @return 是否是一种可能的比赛结果9 q; f( c; Q* }2 b' q' z- W
*/
+ k9 D& O) r ~ public boolean check(int index, int scene, int whichPlayer, int[] record) {
3 r/ u6 H- L% U; c% h/ g int playerIndex = whichPlayer;7 M, |* I5 ]; B/ Z1 T
boolean isWanZhengJu = false;
) K8 X2 o: F i! r% L) i# m( d for (int i = index; i < record.length; i++) {* ?2 {4 Y' E, I( [" n" d
isWanZhengJu = false;
, x' }" x/ I2 G; h! o$ y playerIndex = (whichPlayer + i - index) % 2;/ {0 Q* c! E. v' Y, w% r
bs[scene][playerIndex] += record;
* e1 r0 |3 Z9 X/ J/ v if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局
1 F$ s# H$ j! P) k$ Q: @$ n$ C if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束9 ?8 a. c# R& H$ O
scene++;
1 Z( z* [3 e8 E3 \9 B6 j$ d+ J* ? whichPlayer = scene % 2;* }, V& u% @0 a& u, W% K/ w! c
index = i + 1;- Z1 K$ N6 P8 h/ s+ Q6 g1 U
isWanZhengJu = true;: K+ s4 m8 a0 [7 J; A/ e
continue;
# Y8 y/ u, S/ _ } else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
/ X' f( c5 r e5 w. U- k return false;
4 r" Y" t' Z% O' @9 `' j9 V, i }3 |6 v4 o" l- W1 |2 P) @' }: L
} else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的% n- G: \' s7 n# k5 B
return false;0 g; q ]1 b1 T9 R6 ]5 u) w2 q8 ?
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
7 ^0 h0 ]8 Z* _8 @) }% M2 h scene++;
) Y9 W& v% ^+ k whichPlayer = scene % 2;* \+ Y, M( D7 x' P7 f; w4 |6 R4 [
index = i + 1;# e5 [- ?$ b; p$ @+ u' y
isWanZhengJu = true;$ ^' y( [0 d: _) Y( ?' t7 f
continue;
, v: x% ]' C' G! V" H/ d }: R5 e1 X& o0 o% E$ l L! v
if (record == 10 && i != (record.length - 1)) { //下一个数分情况
7 z/ ^) ]* ` j/ G" Z7 d, q int[][] bsBak = new int[5][2];
/ M, C1 w7 v0 R cpy2deepArr(bs, bsBak);5 `& x M% f0 [1 R$ v% j
if (check(i + 1, scene, playerIndex, record)) {
: |+ _4 {# g. a& N8 W5 A cpy2deepArr(bsBak, bs);" t2 d3 c9 U* @6 N3 `* X$ ~8 q9 }/ \* u% g
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误7 Q1 \, m B, G# _+ m
return false;; f, V7 K$ l$ o: q! I% @
}( o" k; m1 D9 p5 s7 B+ {
return numOfAbleJu < 2;0 p& z! e- e/ [, V5 S7 p4 |& E
} else {/ O v% h7 `" ^1 o2 ^
cpy2deepArr(bsBak, bs);* }. s9 w, l) Z
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
" x; ~1 y0 w' D* G9 P1 }1 }' j return numOfAbleJu < 2;+ }+ j. |, t1 m- U4 G& Y: i
}; B" i; H+ X) d( n' y- H
}
% i+ H. f5 s: y% C- z R" @ return false;
" D) ^( u- L6 i% l }, H( e; {: Y' \+ I$ I1 g+ W6 {+ d
}
- a" D' r1 P0 [' S. g0 b
U, w4 v$ J' V7 i, f+ w if (!isWanZhengJu) {3 S" h1 F2 m3 ?
return false;+ m" U2 g3 B+ O
}
) `2 U3 z" y6 w7 q// //检查是否符合五局三胜8 ]+ r) N" n. W' m) m
// int a = 0, b = 0;* g% L5 t8 h$ V! E. s5 t; c
// for (int i = 0; i < bs.length; i++) {
: s% e& T4 f1 t* Y7 n- T3 q// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
0 G; V S1 V+ G) L- B, W$ q, S! F// break;
0 L8 t, |" o; D2 N0 m// }/ a2 ~0 N! q2 t' Z( b( B1 v9 ]
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制
6 Q+ [5 M, H* U9 z- T// return false;
" y# h, k _8 y( V) Y$ l2 }// }
" o: e4 `; J5 J/ O// if (bs[0] > bs[1]) {
6 ]4 ~8 U% \; q3 ^2 c0 h' e// a++;- U' K9 V( E/ v6 j
// } else {
{6 j Z) g/ {1 s* i! \$ J' V* g& E4 Y// b++;* J4 ^. I- Y; W# z; A' _% G
// }
3 C9 g3 \$ t: V$ s' z- ?! W// }2 j1 n4 ~. j+ }( ~- K
// if (a < 3 && b < 3) {//没有一个人得三局,故错误
7 T- k2 i. q7 x// return false;* M4 N2 V, p& u
// } f2 [$ {4 U) \ s! I1 d
//只要有三局及以上正常结果,则可视为OK" v' ?7 y1 D( W3 W
int count = 0;
/ M' d+ d' b$ z0 W" W+ l for (int i = 0; i < bs.length; i++) {
) F& h0 V N& T+ L3 R% r; Z$ q: o if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了7 r4 ?1 H. _* D5 ~2 q
break;
1 ~4 j- V4 S# z }% V( W: v Z- T+ E* g
count++;
. F; c) [8 m4 Q+ E+ \ }( L0 ~% n1 w3 }& B; E4 b. y2 z
if (count < 3) {) V7 a4 f( n! S: ]* p2 b$ B
return false;
3 q' F) j3 Z3 y0 G" e7 i- n, W/ ? }
0 Y: I: \5 T3 q, [. C; j% O q( M/ {$ x/ Y
# A! Y" B; v# T numOfAbleJu += 1;
: }" _: {% H% T) K+ W return true;
5 r p0 q, G2 R) L1 B, k }
! F4 R$ G& Z3 B- k7 v% D private void cpy2deepArr(int[][] src, int[][] dest) {* U" m" ?& j$ d$ W0 |# [1 W
for (int i = 0; i < src.length; i++) {
) n, U5 Z7 E+ b$ ~4 Y, J$ @3 _ for (int j = 0; j < src.length; j++) {
4 L4 S; w% m W% X( b8 D dest[j] = src[j];
2 |% r7 K2 _' m* c7 m( H }' _# U9 V s. f. H% ~
}
, v2 q; B' p0 {0 S4 }! X: b6 X4 v! G/ R }
3 M6 d0 `+ \: y7 q$ S
2 Z( r& y- q D, V- ]9 y public void printNowCheck() {5 ]- W! }( g A0 Q! ^
for (int i = 0; i < bs.length; i++) {
8 @4 k8 c. X' d5 ~# H# Z; t if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
7 q. \( [5 m( v% f+ L break;
+ a$ x& l" Q' x/ c% p: m }
4 v' P0 ~ G) H- U7 t //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出; e, p- }# U. ?8 C0 w! t. V
if (bs[0] > bs[1]) {
0 ]+ H. v3 T7 P$ d I- v& m System.out.println(bs[0] + ":" + bs[1]);' x, u6 T8 ]. E/ J! z
} else {
7 X( F9 L* F' J System.out.println(bs[1] + ":" + bs[0]);
! N# l7 H2 i3 v! y1 V& i' h% s }
3 V s5 V, D9 G5 L' ~ }8 A8 a8 y- S3 V5 ]& ` ~* G4 u- D
}
- U8 U. T0 l/ { public void resetCheck() {
/ G* W7 v9 ?: l5 C9 B for (int i = 0; i < bs.length; i++) {
6 c8 x1 l, L( b+ _ j P0 P: v+ { bs[0] = 0;
5 |- e5 n1 x, A6 r bs[1] = 0;* s0 P. V& f, Y4 R
}
% p+ e9 B# H# J6 C* m* @# b+ K }* y: J( U9 [+ q( A
/**
& l. `7 g/ P& e. S% |# A * @param args5 E% q# {# J0 Q) B
*/) b4 e( g- k' p3 [8 O
public static void main(String[] args) {4 }, n' d6 J* Q. i
// TODO Auto-generated method stub
$ S b$ ^' W+ B2 s% I GouGouShiJiFen obj = new GouGouShiJiFen();
! a* {& l8 Y8 R% w9 s int[][] testData = {" n" A+ V3 M z. H; y# L5 S4 ?' U: m
{9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},
2 d2 S2 J$ U$ c8 D6 N {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},
+ v2 z% x/ T$ N* \ {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 Z& t( F8 \2 k8 |% ~9 g
};0 c, [3 E" l- S7 o* ?1 Y
for (int i = 0; i < testData.length; i++) {2 Y6 j2 [$ p9 b! c
if (obj.check(0, 0, 0, testData)) {4 ?, x, m9 a- \7 j& e3 p8 A6 a
obj.printNowCheck();
, m2 ^+ C2 J( \( J1 S1 N } else {
3 e- F$ M4 d D9 V' h3 \! S6 V System.out.println("Unknown");
, d* ^" o- C+ a' x- Q }
% Z, V7 f- b4 u$ p! v obj.resetCheck();
, |( d- y, T* c }0 T6 T. D7 m: B
}. S! {8 \" Q' e
4 S+ k) s& x7 ]( Q4 u& I
} |