题目名称:蝈蝈式的记分
. T( Y$ o3 f. n8 V# s. F9 r( `% R( V( m' E6 ^" W. C. P$ r& u
内容描述:
$ R. @8 D' P2 g7 [/ N2 z
# C5 H/ Z7 z" F, a, S" x蝈蝈小朋友刚刚学会了 0-9 这十个数字 , 也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“ 3 2 4 ” 可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用 0-9 这十个数字,所以当比赛选手得分超过 9 的时候,他会用一个 X 来表示 10 完成记分。但问题是,当记录为“ X 3 5 ” 的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。 5 k$ ]# {4 k# o5 H
( j# y" r0 m& |- K( R( S- p因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛进程的情况,也要输出相应的提示哦。 ) F4 ?* U" ?+ j' I
* O+ v1 P: E9 q! K2 s
需要帮蝈蝈进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获得三局的胜利后就获得胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。
" I* J% A& p% l5 T& K X8 F1 q1 g) J$ ]" p- r G& A) x
输入数据:
7 P7 m+ X9 L% b& b& t% |0 a/ r& O- V/ {# H5 K
以 point.in 为输入文件,文件中首行只有一个整数 M ,表示蝈蝈记录了多少场比赛的分数。每场比赛用两行记录,第一行是一个整数 N(N<=1000) 表示当前这个记录中有多少个字符,第二行就是具体的 N 个字符表示记录的分数。
( C; M# f; Z ]5 m8 D% T
$ A U7 t7 E4 o& ]' E' n$ l输出数据: 9 n6 n1 e9 q: U9 \ v. ?
! r# n6 {" l s: }1 J
相应的内容将输出到 point.out 文件中,对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用 ":" 分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测的时候,以” Unknown “一个单词独占一行表示。 - [& P) Y$ J# P9 u7 K# k
& q9 S% @, n- U- J% o+ y E
输入和输出结果数据样例: * Y/ {" f5 t- _( Q* {
$ [, X$ `1 p" d9 a7 M. a: z输入样例 # r* K9 S' F3 y( o/ C0 R; J
% O* y% a$ {7 N3 e3
7 E/ H; g+ T0 R$ u( S I/ [2 f
+ H9 ]8 Z3 T% p$ ?( [. t23 8 F( D# D6 c6 c# o& o) W
; [# [( W0 b/ I/ a2 B. W3 W. ~
9 7 3 6 2 4 7 8 3 2 7 9 X 2 2 1 2 1 X 1 X 1 1
$ N% O/ Z, Y* ?% X( o- W% u: I
8 u# s) N: W9 F- l6 y25 0 n% W% N, @* J2 D3 u9 ~, Z( Q
. f% z) k) Q) }9 m, A
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
+ }: Z$ w) _+ }& \( V0 ?7 z9 g
% w. g3 d: a Q1 k4 x43 S! H' U* @" {: v( Y( ]% |+ C6 I
: {4 h {' }9 d: I# H# A1 [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
' e; q! I' G3 E8 u. N+ u' { 2 p) X& K% Q2 @! j& m6 F6 Z& ]' E
3 n4 b) A1 `9 P9 A1 y0 P% [0 B- j. H- l
输出样例 8 W! j$ i# t* |5 a+ v0 F
$ v2 f! J5 ~! T& C. h. P
21:17 - c" O$ {% L# e1 }
9 U0 H C- R0 n; _# M$ a+ O- Q24:22
' e3 s7 u5 z; r- R7 R, q
' @% |) h2 k; V6 c21:3 % e. s0 \/ w9 H" D1 T
: F- c+ F" V' p% c& x/ tUnknown
+ F x2 w& n2 H, f4 ]3 D# A& Q8 |4 L1 F/ I1 J+ r
21:14
, n' j' _' c F1 s: I0 u( u+ U% U: \8 k
20:22
$ v: y; l) A- @( L( p$ ~8 {7 o2 n4 `1 b
21:23 9 c8 v- }; S9 r: F4 I% q* ]9 d4 u
( T4 }0 H. y h$ E9 t' R21:16
$ d& e& b) o( ~1 | Y/ ~! V+ c. @; ?' x8 U8 r
21:9 8 y2 p2 R5 a, n+ H/ Y. `
9 |# r# z ]; Y0 q
6 X4 o6 F( ]/ r; ~2 zexample: public class GouGouShiJiFen {1 Y2 {, [2 R% E: e% C( {: K
" s( K. j% ]' }8 _# N public int[][] bs = new int[5][2];//当前可能的比赛结果5 L- a3 V4 J3 w% j k2 o1 K6 [
// public int[][] bsOK = new int[5][2];//成功的一种可能比赛结果
: m' }9 Q" q- F6 A- w0 ~// public int[][] bsBak = new int[5][2];//当前可能的比赛结果备份
+ f& Z) B D7 N// public boolean hasAOKBS = false;//是否己经有一种可能的比赛结果,如果有多种可能性,那也是Unknown$ A0 r$ s% \ J) l
public int numOfAbleJu = 0; //本行比赛可能的结果有几种
0 B* N# e+ F# _ & y% ]5 H# n9 Z5 g/ J9 r7 {
/**, A; G# _0 a$ o1 _
* @param index 连续得失分的index
. D% e* c2 ?& H( k5 J * @param scene 第几局比赛" x7 Z' f& {2 c* b$ ]- r5 H
* @param whichPlayer index处分为哪个选手得分+ {% K' }1 Z: R6 M3 C) s
* @param record GuoGuo记的一行分7 q, k5 i6 A( k; K6 z
* @return 是否是一种可能的比赛结果
7 h) s, A5 B8 U% h; z */5 V9 ~8 t( t: y
public boolean check(int index, int scene, int whichPlayer, int[] record) {
; {8 F$ _3 d9 O' s d2 @ int playerIndex = whichPlayer;
$ q* c7 W, e$ Q/ p9 B" o boolean isWanZhengJu = false;* c6 c* y: ^2 n6 s6 R1 h
for (int i = index; i < record.length; i++) {
. K0 `6 R6 \$ L; |( b1 m isWanZhengJu = false;: B S3 k: X3 j l8 b
playerIndex = (whichPlayer + i - index) % 2;
2 q6 h4 m4 x6 k, w9 z bs[scene][playerIndex] += record;
2 R1 B* M0 q, F' x; l% s; A, O* X; Z if (bs[scene][0] >= 19 && bs[scene][1] >= 19) {//延长球或21:19 必须差二分才算正常结束一局7 Q4 j+ o& O; {3 Y( f1 t+ ?8 y) `
if (Math.abs(bs[scene][0] - bs[scene][1]) == 2) {//一局正常结束' u( k* N2 p2 h l4 E$ c
scene++;% w0 v; M+ E* M# U
whichPlayer = scene % 2;
2 `$ l. l$ S( {# t, W index = i + 1;
" U0 ~2 @0 r/ r; ]" V* y isWanZhengJu = true;
# H R N( B, t" @2 u continue;: u' O: d$ [& f; b
} else if (Math.abs(bs[scene][0] - bs[scene][1]) > 2) {//两者相差大于2球,则错误的
$ s) p% }( s! t$ \ return false;
& o8 Z' j* v# q4 y( A. F6 k }
7 J A/ u$ z' M% J4 [9 }2 ~ } else if ((bs[scene][0] > 21 && bs[scene][1] <= 19) || (bs[scene][1] > 21 && bs[scene][0] <= 19)) {//一方超过21,一方<=19,是错误的
, a4 G* h" _* d, Y1 n* K return false; P- A2 U- n# m5 x& I7 c. C/ I
} else if (bs[scene][0] == 21 || bs[scene][1] == 21) {//一方为21,另一方<=19,一局正常结束
+ b; P+ y+ L: s3 e {' }5 b scene++;2 ?7 `) M& T7 {9 ]+ s
whichPlayer = scene % 2;) g1 _! C& w1 Q1 W7 w9 g
index = i + 1;+ c+ q. l/ k6 N0 s) J# f$ c
isWanZhengJu = true;
) Z1 H) p' \9 k continue;
( d) m5 U* b: J+ `; a/ V- j% B }
1 Z) d( p+ y! r5 H0 b if (record == 10 && i != (record.length - 1)) { //下一个数分情况
- z& a/ L3 z3 y" r; z: X t/ M% s int[][] bsBak = new int[5][2];
$ p3 W6 n6 ?9 u5 _ cpy2deepArr(bs, bsBak);5 Q" x& m0 R& \+ c& m8 y
if (check(i + 1, scene, playerIndex, record)) {
, K7 _. d8 @8 ]4 E" N6 N- _ cpy2deepArr(bsBak, bs);
$ j+ _6 A, c& U9 T$ F) \ W: Z+ K$ ~ if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {//有两种比赛结果,错误' [/ Y ^4 d2 D, J J
return false;/ g y* F) w5 e/ ^5 s
}
) r8 U/ z w; R3 K, B return numOfAbleJu < 2;2 d4 t1 n, Y0 d- @
} else {8 A) u5 Z" w+ s, l' u
cpy2deepArr(bsBak, bs); G, Z* p% t2 q3 x3 Q1 T8 h
if (check(i + 1, scene, (playerIndex + 1) % 2, record)) {
& _2 F3 K! n/ l6 R return numOfAbleJu < 2;
7 A9 y6 g# V. e( \( c2 y }
2 f2 _) J! P$ I1 O' q S }
& x8 [$ [. K0 w return false;! k/ m- _; O, i! d H, ]) d
}+ c+ b7 Q" \; `' m& Z/ _" K
}
5 y: v- m; ]# d) b4 X
! q' k3 `/ J- O if (!isWanZhengJu) {
% L+ |' ^; H, E# L h/ [( H6 \/ E return false;- p; M. S% L3 I0 @% N
}" }; ^/ k: h3 m7 V
// //检查是否符合五局三胜, t6 l3 X4 r/ f5 w
// int a = 0, b = 0;! | C0 R8 f2 A
// for (int i = 0; i < bs.length; i++) {) [8 i1 r4 C2 U: }- U/ K
// if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了. h- T! [ d: Q* U2 O
// break;0 B7 V8 W/ X( a+ I" b) |7 o
// }, k4 {1 ^* K, e# O& o4 P f4 ]
// if (a == 3 || b == 3) {//己经有人先得三局,但是还有局待检查,不合五局三胜制9 e, w. D5 Y# m6 K1 i# y! x
// return false;3 {) m- t8 \! l: }4 t
// }* ` |& q: L+ s, ?) N( q' G: @' J
// if (bs[0] > bs[1]) {
0 g* C" E; e* G9 r! }5 o// a++;' t# h! n8 o! X1 h% ^3 d; y0 ]6 ~
// } else {
. E5 S: @( B3 N& X# M1 W# U5 I// b++;
; Z. ]- j" Q: l9 Z2 s4 g// }
) Y" b, K. Y0 K) k- f/ d// }
# {' l* X4 J# Q% H- b: b// if (a < 3 && b < 3) {//没有一个人得三局,故错误+ B0 s6 z" k5 t; G% N) ~
// return false;
2 h3 V) N; u6 K" z% `, G// }* Q) k' G) K/ Y7 f4 \. A
//只要有三局及以上正常结果,则可视为OK8 { _8 C0 w9 ?
int count = 0;
+ U$ A J& w/ R' i( } z for (int i = 0; i < bs.length; i++) {; V1 n5 q6 ~% I" o2 o
if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
4 L& Q$ |- `* |! n' g break;7 G# P3 o+ i8 `% M5 J) I# I$ K
}3 {" e V0 A% q+ b
count++;
/ E! L2 h7 f, h0 M7 [6 c# D% e }
1 A" L) D" L' T v if (count < 3) {# x; }. q1 e4 v3 V6 T& A
return false;: Y X" E6 H; }2 v7 }' j* |1 {/ E$ X" V
}( ~2 t- G; P! s. t
4 [6 u" h; G7 \6 [! y3 O! z
numOfAbleJu += 1;$ Z2 [2 A+ A$ T/ H3 K5 m" t9 L
return true;/ S c# y! `, \7 q8 _' e h7 |
}
: K( B" }: }. u e2 e private void cpy2deepArr(int[][] src, int[][] dest) {2 }6 [' m9 M. L" f. V
for (int i = 0; i < src.length; i++) {& e$ ^2 c+ M) u
for (int j = 0; j < src.length; j++) {0 M* C) s+ Q2 f6 Z, {; m7 s9 l
dest[j] = src[j];
0 t1 V( F2 T. i5 @) e }
9 Z% p: D G. w* m* [/ p }
3 L- t; }8 G0 C" ? }
% i" c; z0 j/ w& \4 @
& Y" R* p) d# _3 x public void printNowCheck() {( l; y3 R# I/ L2 J" A5 _
for (int i = 0; i < bs.length; i++) {
2 k: M4 p) D3 b, Q if (bs[0] == 0 && bs[1] == 0) {//没有局待检查了
) P4 o' ^. o0 H' t# L break;6 z& B. }# b2 g4 {+ W0 s! ?9 |
}
% c* n: H/ x, l# ^' D) `" @$ s1 b //因为无法得知两位选手谁赢哪局,故以大比分:小比分输出6 m. l/ U+ r9 R' v
if (bs[0] > bs[1]) {
4 q" T- p3 \2 b$ B# M System.out.println(bs[0] + ":" + bs[1]);
; J: Q. d7 B6 T' O6 F } else {
( T+ U6 c; T$ p System.out.println(bs[1] + ":" + bs[0]);/ ]& g C# S; ^( y
}( E9 a( R0 o% g8 e1 W
}
1 F% |8 w8 o; S7 O4 H }( d! D, I. }5 T) x5 `( {! w
public void resetCheck() {
3 c* _1 O) d0 n, Y3 b for (int i = 0; i < bs.length; i++) {
+ y" y; W: s% a) Q bs[0] = 0;
# L' t, ?! M( E" d: _! S, W bs[1] = 0;
: h2 w& R N: h }
9 c. v0 P0 \2 `% ]9 g1 u }
7 T% W, ~3 N- l2 L9 x4 D; z /**5 y p: I# q9 Z
* @param args/ ^, d& R1 D, N$ @4 A; K
*/
2 R9 ~9 Z( i3 r/ i. W' c- u. k public static void main(String[] args) {5 Z/ Y2 v* r# v( t. x
// TODO Auto-generated method stub% A6 B0 Y1 M" z% [3 L4 M
GouGouShiJiFen obj = new GouGouShiJiFen();
& v2 _2 v0 S! S5 h7 I* u int[][] testData = {
4 S _9 w" m: b Z( ?/ I) e* s+ s {9, 7, 3, 6, 2, 4, 7, 8, 3, 2, 7, 9, 10, 2, 2, 1, 2, 1, 10, 1, 10, 1, 1},0 t& B( ]' w1 R0 y2 x" v7 C
{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},
' ~( f; @; ?+ {( d9 ]* F: h {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}
, q. r3 S8 m7 m; Z4 R/ p C };
$ d, ~ M H4 s" y for (int i = 0; i < testData.length; i++) {
! y7 o0 Q* v: H* S if (obj.check(0, 0, 0, testData)) {4 l* @2 Z, p+ Z* F; c
obj.printNowCheck();8 X+ u: o( K: C9 Z5 u% `$ Q5 I, C
} else {! A" _5 q& ?; t! E
System.out.println("Unknown");+ p; g2 Y, E4 H+ @, D
}
7 u+ q1 j- C9 l' P' f obj.resetCheck();
$ x4 \+ J4 t* G2 E }' V9 x) i1 |0 b( v& I3 \9 T
}
- O- E/ K, r; u, l: Y R
" X. b5 f6 r1 Q, J} |